21 Commits
Author SHA1 Message Date
hoo2 c485d0db2d HW2: RC3a - Change the sbatch scripts for a different executables directory 2025-01-05 14:24:05 +02:00
hoo2 df92833c1b HW2: RC3a - Remove stats optimization 2025-01-05 14:05:47 +02:00
hoo2 0e44a3062c HW2: RC3 - Batch scripts added 2025-01-04 19:25:13 +02:00
hoo2 4e7237bd4d HW2: RC3 - A small exchange optimization 2025-01-04 16:56:34 +02:00
hoo2 bc98ef4e9f HW2: RC2 - Parallel Full Sort 2025-01-03 16:15:13 +02:00
hoo2 1bd0cbb8d0 HW2: RC1 - Model version 2025-01-03 14:45:16 +02:00
hoo2 4dc47bb8f4 HW2: Add perf rule 2024-12-31 14:26:53 +02:00
hoo2 36de8d94fc HW2: A validator added and small changes 2024-12-31 12:54:58 +02:00
hoo2 9dd3eb737f HW2: Added some test and fix bubblesort <number of iteration> bug 2024-12-30 22:03:30 +02:00
hoo2 c5ffec9cca HW2: First locally working version of the 2 variations 2024-12-30 19:12:55 +02:00
hoo2 4d1d7502aa HW2: (WIP) Checkpoint with code re-arrangement and elbowSort 2024-12-30 14:23:13 +02:00
hoo2 1d6b271d2a HW2: Add an MPI wrapper for the basic functionality and update all types 2024-12-28 17:36:00 +02:00
hoo2 496ee69f54 HW2: A local version of distbubbletonic added 2024-12-28 14:53:13 +02:00
hoo2 43dff95f67 HW2: A local only version of the distbitonic 2024-12-28 01:40:43 +02:00
hoo2 428b50aab7 HW2: First MPI test on AUTh's cluster 2024-12-27 11:56:26 +02:00
hoo2 058df095b0 HW2: Setup build env and basic code setup 2024-12-26 12:04:24 +02:00
hoo2 64dc18280c HW2: Init C++ project 2024-12-25 10:02:48 +02:00
hoo2 61b63016cc HW2: Add julia implementations for v0.5 and v1 2024-12-24 17:58:10 +02:00
hoo2 955981d177 Refresh the report and better commenting 2024-11-21 22:56:37 +02:00
hoo2 381a5737db Copy report to the repo also (no code changes only comments) 2024-11-21 15:18:39 +02:00
hoo2 494fdddd04 v1 version and measurements 2024-11-20 21:56:04 +02:00
94 changed files with 35421 additions and 964 deletions
-9
View File
@@ -1,9 +0,0 @@
## NOTE ##
This folder contains the output files from tests.
In order to populate it, run the tests
$> make tests
$> ./tests
Binary file not shown.
Binary file not shown.
+94 -64
View File
@@ -1,5 +1,5 @@
#
# PDS homework_1 Makefile
# PDS HW2 Makefile
#
# Copyright (C) 2024 Christos Choutouridis <christos@choutouridis.net>
#
@@ -20,12 +20,17 @@
# ============== Project settings ==============
# Project's name
PROJECT := PDS_homework_2
# Excecutable's name
TARGET := distbitonic
TARGET := bitonic
# Source directories list(space seperated). Makefile-relative path, UNDER current directory.
SRC_DIR_LIST := src
SRC_DIR_LIST := src test test/gtest
# Include directories list(space seperated). Makefile-relative path.
INC_DIR_LIST := include \
test \
test/gtest/ \
/usr/lib/x86_64-linux-gnu/openmpi/include/ \
src
@@ -37,21 +42,22 @@ BUILD_DIR := bin
OBJ_DIR := $(BUILD_DIR)/obj
DEP_DIR := $(BUILD_DIR)/.dep
OUTPUT_DIR := out-rc3a
# ========== Compiler settings ==========
# Compiler flags for debug and release
DEB_CFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c11
REL_CFLAGS := -Wall -Wextra -O3 -std=c11
DEB_CXXFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c++17
REL_CXXFLAGS := -Wall -Wextra -O3 -std=c++17
DEB_CFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c11 -fopenmp
REL_CFLAGS := -Wall -Wextra -O3 -std=c11 -fopenmp
DEB_CXXFLAGS := -DDEBUG -g3 -Wall -Wextra -std=c++17 -fopenmp
REL_CXXFLAGS := -Wall -Wextra -O3 -std=c++17 -fopenmp
# Pre-defines
# PRE_DEFS := MYCAB=1729 SUPER_MODE
PRE_DEFS :=
PRE_DEFS := _GLIBCXX_PARALLEL
# ============== Linker settings ==============
# Linker flags (example: -pthread -lm)
LDFLAGS := -pthread
LDFLAGS := -pthread -fopenmp
# Map output file
MAP_FILE := output.map
@@ -148,6 +154,14 @@ $(BUILD_DIR)/$(TARGET): $(OBJ)
@$(CSIZE) $(@D)/$(TARGET)
@echo Done
#
# ================ Default local build rules =================
# example:
# make debug
.DEFAULT_GOAL := all
.PHONY: clean
clean:
@echo Cleaning build directories
@@ -155,67 +169,83 @@ clean:
@rm -rf $(DEP_DIR)
@rm -rf $(BUILD_DIR)
#
# ================ Local build rules =================
# example:
# make debug
debug: CFLAGS := $(DEB_CFLAGS)
debug: $(BUILD_DIR)/$(TARGET)
release: CFLAGS := $(REL_CFLAGS)
release: $(BUILD_DIR)/$(TARGET)
all: release
hpc-results/post:
$(CXX) $(CFLAGS) -o $@ hpc-results/main.cpp
hpc-clean:
rm hpc-results/post
#
# ================ Local (and/or) via docker build rules =================
#
# examples:
# make IMAGE=hpcimage v0
# make IMAGE=hpcimage v1_cilk
#
dist_v05: CC := mpicc
dist_v05: CXX := mpic++
dist_v05: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=50
dist_v05: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=50
dist_v05: TARGET := dist_v05
dist_v05: $(BUILD_DIR)/$(TARGET)
dist_v1: CC := mpicc
dist_v1: CXX := mpic++
dist_v1: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=100
dist_v1: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=100
dist_v1: TARGET := dist_v1
dist_v1: $(BUILD_DIR)/$(TARGET)
#
# ========= Inside CSAL Image build rules ===========
#
# 1) first jump into image (make sure you are in the directory where Makefile is):
# > docker run -it -v ${PWD}:/usr/src/exercise_1 -w /usr/src/exercise_1/ hpcimage
# 2) Clean binaries first **important**
# > make clean
# 3) for v4 cilk for example:
# > make csal_v4_cilk
# 4) run executables from `bin/`. Examples:
# > ./bin/tcount_ompv3 -i mtx/NACA0015.mtx --timing -r 3 -o /dev/null
# > ./bin/tcount_pthv4 -i mtx/com_Youtube.mtx --timing --dynamic --print_count
#
# ======== Run from container =========
#
# examples:
#
# make IMAGE=hpcimage EXEC=knnsearch_v1 run
# make IMAGE=hpcimage EXEC=knnsearch_v1 run
# ================ Build rules =================
#
# Local or inside HPC rules
distbubbletonic: CC := mpicc
distbubbletonic: CXX := mpic++
distbubbletonic: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=BUBBLETONIC
distbubbletonic: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=BUBBLETONIC
distbubbletonic: TARGET := distbubbletonic
distbubbletonic: $(BUILD_DIR)/$(TARGET)
@mkdir -p $(OUTPUT_DIR)
cp $(BUILD_DIR)/$(TARGET) $(OUTPUT_DIR)/$(TARGET)
distbitonic: CC := mpicc
distbitonic: CXX := mpic++
distbitonic: CFLAGS := $(REL_CFLAGS) -DCODE_VERSION=BITONIC
distbitonic: CXXFLAGS := $(REL_CXXFLAGS) -DCODE_VERSION=BITONIC
distbitonic: TARGET := distbitonic
distbitonic: $(BUILD_DIR)/$(TARGET)
@mkdir -p $(OUTPUT_DIR)
cp $(BUILD_DIR)/$(TARGET) $(OUTPUT_DIR)/$(TARGET)
deb_distbubbletonic: CC := mpicc
deb_distbubbletonic: CXX := mpic++
deb_distbubbletonic: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=BUBBLETONIC -DDEBUG
deb_distbubbletonic: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=BUBBLETONIC -DDEBUG
deb_distbubbletonic: TARGET := deb_distbubbletonic
deb_distbubbletonic: $(BUILD_DIR)/$(TARGET)
@mkdir -p $(OUTPUT_DIR)
cp $(BUILD_DIR)/$(TARGET) $(OUTPUT_DIR)/$(TARGET)
deb_distbitonic: CC := mpicc
deb_distbitonic: CXX := mpic++
deb_distbitonic: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=BITONIC -DDEBUG
deb_distbitonic: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=BITONIC -DDEBUG
deb_distbitonic: TARGET := deb_distbitonic
deb_distbitonic: $(BUILD_DIR)/$(TARGET)
@mkdir -p $(OUTPUT_DIR)
cp $(BUILD_DIR)/$(TARGET) $(OUTPUT_DIR)/$(TARGET)
tests: CC := mpicc
tests: CXX := mpic++
tests: CFLAGS := $(DEB_CFLAGS) -DCODE_VERSION=BITONIC -DDEBUG -DTESTING
tests: CXXFLAGS := $(DEB_CXXFLAGS) -DCODE_VERSION=BITONIC -DDEBUG -DTESTING
tests: TARGET := tests
tests: $(BUILD_DIR)/$(TARGET)
@mkdir -p $(OUTPUT_DIR)
cp $(BUILD_DIR)/$(TARGET) $(OUTPUT_DIR)/$(TARGET)
perfbitonic: CC := mpicc
perfbitonic: CXX := mpic++
perfbitonic: CFLAGS := $(REL_CFLAGS) -g -DCODE_VERSION=BITONIC
perfbitonic: CXXFLAGS := $(REL_CXXFLAGS) -g -DCODE_VERSION=BITONIC
perfbitonic: TARGET := perfbitonic
perfbitonic: $(BUILD_DIR)/$(TARGET)
@mkdir -p $(OUTPUT_DIR)
cp $(BUILD_DIR)/$(TARGET) $(OUTPUT_DIR)/$(TARGET)
hpc-build:
make clean
make distbubbletonic
make clean
make distbitonic
make clean
make tests
all: debug distbubbletonic distbitonic
# Note:
# Add a gcc based make rule here in order for clangd to successfully scan the project files.
# Otherwise we do not need the gcc build.
+5
View File
@@ -0,0 +1,5 @@
# Analyze files ignore configuration
*.collapsed
*.perf
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 1) Total : 139 [msec]
[Timing] (Rank 1) Full-Sort : 93 [msec]
[Timing] (Rank 1) Exchange : 17 [msec]
[Timing] (Rank 1) Min-Max : 2415 [usec]
[Timing] (Rank 1) Elbow-Sort: 26 [msec]
[Timing] (Rank 3) Total : 138 [msec]
[Timing] (Rank 3) Full-Sort : 93 [msec]
[Timing] (Rank 3) Exchange : 16 [msec]
[Timing] (Rank 3) Min-Max : 2463 [usec]
[Timing] (Rank 3) Elbow-Sort: 26 [msec]
[Timing] (Rank 0) Total : 138 [msec]
[Timing] (Rank 0) Full-Sort : 95 [msec]
[Timing] (Rank 0) Exchange : 13 [msec]
[Timing] (Rank 0) Min-Max : 2667 [usec]
[Timing] (Rank 0) Elbow-Sort: 26 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 137 [msec]
[Timing] (Rank 2) Full-Sort : 95 [msec]
[Timing] (Rank 2) Exchange : 12 [msec]
[Timing] (Rank 2) Min-Max : 2624 [usec]
[Timing] (Rank 2) Elbow-Sort: 26 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 0) Total : 10 [sec]
[Timing] (Rank 0) Full-Sort : 7935 [msec]
[Timing] (Rank 0) Exchange : 224 [msec]
[Timing] (Rank 0) Min-Max : 202 [msec]
[Timing] (Rank 0) Elbow-Sort: 1717 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 10 [sec]
[Timing] (Rank 1) Full-Sort : 7709 [msec]
[Timing] (Rank 1) Exchange : 441 [msec]
[Timing] (Rank 1) Min-Max : 203 [msec]
[Timing] (Rank 1) Elbow-Sort: 1716 [msec]
[Timing] (Rank 3) Total : 10 [sec]
[Timing] (Rank 3) Full-Sort : 7659 [msec]
[Timing] (Rank 3) Exchange : 482 [msec]
[Timing] (Rank 3) Min-Max : 205 [msec]
[Timing] (Rank 3) Elbow-Sort: 1710 [msec]
[Timing] (Rank 2) Total : 10 [sec]
[Timing] (Rank 2) Full-Sort : 7852 [msec]
[Timing] (Rank 2) Exchange : 293 [msec]
[Timing] (Rank 2) Min-Max : 208 [msec]
[Timing] (Rank 2) Elbow-Sort: 1711 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 3) Total : 20 [sec]
[Timing] (Rank 3) Full-Sort : 15 [sec]
[Timing] (Rank 3) Exchange : 1057 [msec]
[Timing] (Rank 3) Min-Max : 420 [msec]
[Timing] (Rank 3) Elbow-Sort: 3435 [msec]
[Timing] (Rank 1) Total : 20 [sec]
[Timing] (Rank 1) Full-Sort : 15 [sec]
[Timing] (Rank 1) Exchange : 1012 [msec]
[Timing] (Rank 1) Min-Max : 428 [msec]
[Timing] (Rank 1) Elbow-Sort: 3456 [msec]
[Timing] (Rank 0) Total : 20 [sec]
[Timing] (Rank 0) Full-Sort : 16 [sec]
[Timing] (Rank 0) Exchange : 478 [msec]
[Timing] (Rank 0) Min-Max : 433 [msec]
[Timing] (Rank 0) Elbow-Sort: 3437 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 20 [sec]
[Timing] (Rank 2) Full-Sort : 16 [sec]
[Timing] (Rank 2) Exchange : 455 [msec]
[Timing] (Rank 2) Min-Max : 420 [msec]
[Timing] (Rank 2) Elbow-Sort: 3417 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 0) Total : 140 [msec]
[Timing] (Rank 0) Full-Sort : 95 [msec]
[Timing] (Rank 0) Exchange : 15 [msec]
[Timing] (Rank 0) Min-Max : 2048 [usec]
[Timing] (Rank 0) Elbow-Sort: 26 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 156 [msec]
[Timing] (Rank 1) Full-Sort : 92 [msec]
[Timing] (Rank 1) Exchange : 35 [msec]
[Timing] (Rank 1) Min-Max : 1515 [usec]
[Timing] (Rank 1) Elbow-Sort: 26 [msec]
[Timing] (Rank 2) Total : 156 [msec]
[Timing] (Rank 2) Full-Sort : 94 [msec]
[Timing] (Rank 2) Exchange : 33 [msec]
[Timing] (Rank 2) Min-Max : 1325 [usec]
[Timing] (Rank 2) Elbow-Sort: 26 [msec]
[Timing] (Rank 3) Total : 155 [msec]
[Timing] (Rank 3) Full-Sort : 92 [msec]
[Timing] (Rank 3) Exchange : 36 [msec]
[Timing] (Rank 3) Min-Max : 1328 [usec]
[Timing] (Rank 3) Elbow-Sort: 26 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 2) Total : 9953 [msec]
[Timing] (Rank 2) Full-Sort : 7910 [msec]
[Timing] (Rank 2) Exchange : 172 [msec]
[Timing] (Rank 2) Min-Max : 163 [msec]
[Timing] (Rank 2) Elbow-Sort: 1707 [msec]
[Timing] (Rank 0) Total : 9972 [msec]
[Timing] (Rank 0) Full-Sort : 7863 [msec]
[Timing] (Rank 0) Exchange : 208 [msec]
[Timing] (Rank 0) Min-Max : 186 [msec]
[Timing] (Rank 0) Elbow-Sort: 1715 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 9966 [msec]
[Timing] (Rank 1) Full-Sort : 7661 [msec]
[Timing] (Rank 1) Exchange : 429 [msec]
[Timing] (Rank 1) Min-Max : 161 [msec]
[Timing] (Rank 1) Elbow-Sort: 1714 [msec]
[Timing] (Rank 3) Total : 9956 [msec]
[Timing] (Rank 3) Full-Sort : 7607 [msec]
[Timing] (Rank 3) Exchange : 481 [msec]
[Timing] (Rank 3) Min-Max : 161 [msec]
[Timing] (Rank 3) Elbow-Sort: 1705 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 2) Total : 20 [sec]
[Timing] (Rank 2) Full-Sort : 16 [sec]
[Timing] (Rank 2) Exchange : 344 [msec]
[Timing] (Rank 2) Min-Max : 326 [msec]
[Timing] (Rank 2) Elbow-Sort: 3414 [msec]
[Timing] (Rank 0) Total : 20 [sec]
[Timing] (Rank 0) Full-Sort : 16 [sec]
[Timing] (Rank 0) Exchange : 421 [msec]
[Timing] (Rank 0) Min-Max : 374 [msec]
[Timing] (Rank 0) Elbow-Sort: 3430 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 20 [sec]
[Timing] (Rank 1) Full-Sort : 15 [sec]
[Timing] (Rank 1) Exchange : 664 [msec]
[Timing] (Rank 1) Min-Max : 322 [msec]
[Timing] (Rank 1) Elbow-Sort: 3448 [msec]
[Timing] (Rank 3) Total : 20 [sec]
[Timing] (Rank 3) Full-Sort : 15 [sec]
[Timing] (Rank 3) Exchange : 696 [msec]
[Timing] (Rank 3) Min-Max : 323 [msec]
[Timing] (Rank 3) Elbow-Sort: 3432 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 0) Total : 8017 [msec]
[Timing] (Rank 0) Full-Sort : 3946 [msec]
[Timing] (Rank 0) Exchange : 1300 [msec]
[Timing] (Rank 0) Min-Max : 305 [msec]
[Timing] (Rank 0) Elbow-Sort: 2464 [msec]
Results validation ... [PASS] 
[Timing] (Rank 3) Total : 7424 [msec]
[Timing] (Rank 3) Full-Sort : 4147 [msec]
[Timing] (Rank 3) Exchange : 495 [msec]
[Timing] (Rank 3) Min-Max : 302 [msec]
[Timing] (Rank 3) Elbow-Sort: 2479 [msec]
[Timing] (Rank 2) Total : 8015 [msec]
[Timing] (Rank 2) Full-Sort : 3950 [msec]
[Timing] (Rank 2) Exchange : 1283 [msec]
[Timing] (Rank 2) Min-Max : 303 [msec]
[Timing] (Rank 2) Elbow-Sort: 2477 [msec]
[Timing] (Rank 1) Total : 7957 [msec]
[Timing] (Rank 1) Full-Sort : 3959 [msec]
[Timing] (Rank 1) Exchange : 1238 [msec]
[Timing] (Rank 1) Min-Max : 295 [msec]
[Timing] (Rank 1) Elbow-Sort: 2463 [msec]
@@ -0,0 +1,8 @@
[cchoutou@aristotle6 homework_2]$ squeue -u cchoutou
JOBID PARTITION NAME USER TIME TIME_LIMIT ST NODES CPUS NODELIST(REASON)
1873623 rome N4P32T4Q20 cchoutou 0:00 5:00 PD 4 512 (Priority)
1873657 rome N4P32T4Q23 cchoutou 0:00 5:00 PD 4 512 (Priority)
1873660 rome N4P32T4Q25 cchoutou 0:00 5:00 PD 4 512 (Priority)
1873663 rome N4P32T4Q27 cchoutou 0:00 5:00 PD 4 512 (Priority)
@@ -0,0 +1,10 @@
[cchoutou@aristotle6 homework_2]$ squeue -u cchoutou
JOBID PARTITION NAME USER TIME TIME_LIMIT ST NODES CPUS NODELIST(REASON)
1873623 rome N4P32T4Q20 cchoutou 0:00 5:00 PD 4 512 (Priority)
1873657 rome N4P32T4Q23 cchoutou 0:00 5:00 PD 4 512 (Priority)
1873660 rome N4P32T4Q25 cchoutou 0:00 5:00 PD 4 512 (Priority)
1873663 rome N4P32T4Q27 cchoutou 0:00 5:00 PD 4 512 (Priority)
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 48 [msec]
[Timing] (Rank 0) Full-Sort : 24 [msec]
[Timing] (Rank 0) Exchange : 10 [msec]
[Timing] (Rank 0) Min-Max : 1017 [usec]
[Timing] (Rank 0) Elbow-Sort: 9637 [usec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 41 [msec]
[Timing] (Rank 1) Full-Sort : 24 [msec]
[Timing] (Rank 1) Exchange : 1736 [usec]
[Timing] (Rank 1) Min-Max : 1060 [usec]
[Timing] (Rank 1) Elbow-Sort: 9671 [usec]
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 382 [msec]
[Timing] (Rank 0) Full-Sort : 213 [msec]
[Timing] (Rank 0) Exchange : 57 [msec]
[Timing] (Rank 0) Min-Max : 6196 [usec]
[Timing] (Rank 0) Elbow-Sort: 77 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 343 [msec]
[Timing] (Rank 1) Full-Sort : 216 [msec]
[Timing] (Rank 1) Exchange : 9082 [usec]
[Timing] (Rank 1) Min-Max : 6211 [usec]
[Timing] (Rank 1) Elbow-Sort: 77 [msec]
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 1611 [msec]
[Timing] (Rank 0) Full-Sort : 919 [msec]
[Timing] (Rank 0) Exchange : 244 [msec]
[Timing] (Rank 0) Min-Max : 24 [msec]
[Timing] (Rank 0) Elbow-Sort: 309 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 1458 [msec]
[Timing] (Rank 1) Full-Sort : 949 [msec]
[Timing] (Rank 1) Exchange : 40 [msec]
[Timing] (Rank 1) Min-Max : 24 [msec]
[Timing] (Rank 1) Elbow-Sort: 309 [msec]
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 6931 [msec]
[Timing] (Rank 0) Full-Sort : 3936 [msec]
[Timing] (Rank 0) Exchange : 1188 [msec]
[Timing] (Rank 0) Min-Max : 98 [msec]
[Timing] (Rank 0) Elbow-Sort: 1252 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 6299 [msec]
[Timing] (Rank 1) Full-Sort : 4012 [msec]
[Timing] (Rank 1) Exchange : 303 [msec]
[Timing] (Rank 1) Min-Max : 140 [msec]
[Timing] (Rank 1) Elbow-Sort: 1287 [msec]
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 2) Total : 68 [msec]
[Timing] (Rank 2) Full-Sort : 23 [msec]
[Timing] (Rank 2) Exchange : 18 [msec]
[Timing] (Rank 2) Min-Max : 2051 [usec]
[Timing] (Rank 2) Elbow-Sort: 19 [msec]
[Timing] (Rank 1) Total : 68 [msec]
[Timing] (Rank 1) Full-Sort : 23 [msec]
[Timing] (Rank 1) Exchange : 14 [msec]
[Timing] (Rank 1) Min-Max : 2858 [usec]
[Timing] (Rank 1) Elbow-Sort: 19 [msec]
[Timing] (Rank 0) Total : 69 [msec]
[Timing] (Rank 0) Full-Sort : 24 [msec]
[Timing] (Rank 0) Exchange : 19 [msec]
[Timing] (Rank 0) Min-Max : 2030 [usec]
[Timing] (Rank 0) Elbow-Sort: 19 [msec]
Results validation ... [PASS] 
[Timing] (Rank 3) Total : 61 [msec]
[Timing] (Rank 3) Full-Sort : 24 [msec]
[Timing] (Rank 3) Exchange : 6663 [usec]
[Timing] (Rank 3) Min-Max : 3011 [usec]
[Timing] (Rank 3) Elbow-Sort: 19 [msec]
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 1) Total : 543 [msec]
[Timing] (Rank 1) Full-Sort : 214 [msec]
[Timing] (Rank 1) Exchange : 90 [msec]
[Timing] (Rank 1) Min-Max : 18 [msec]
[Timing] (Rank 1) Elbow-Sort: 154 [msec]
[Timing] (Rank 0) Total : 547 [msec]
[Timing] (Rank 0) Full-Sort : 216 [msec]
[Timing] (Rank 0) Exchange : 120 [msec]
[Timing] (Rank 0) Min-Max : 13 [msec]
[Timing] (Rank 0) Elbow-Sort: 154 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 543 [msec]
[Timing] (Rank 2) Full-Sort : 216 [msec]
[Timing] (Rank 2) Exchange : 113 [msec]
[Timing] (Rank 2) Min-Max : 14 [msec]
[Timing] (Rank 2) Elbow-Sort: 154 [msec]
[Timing] (Rank 3) Total : 495 [msec]
[Timing] (Rank 3) Full-Sort : 218 [msec]
[Timing] (Rank 3) Exchange : 37 [msec]
[Timing] (Rank 3) Min-Max : 19 [msec]
[Timing] (Rank 3) Elbow-Sort: 155 [msec]
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 2227 [msec]
[Timing] (Rank 0) Full-Sort : 915 [msec]
[Timing] (Rank 0) Exchange : 468 [msec]
[Timing] (Rank 0) Min-Max : 49 [msec]
[Timing] (Rank 0) Elbow-Sort: 620 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 2191 [msec]
[Timing] (Rank 2) Full-Sort : 922 [msec]
[Timing] (Rank 2) Exchange : 424 [msec]
[Timing] (Rank 2) Min-Max : 49 [msec]
[Timing] (Rank 2) Elbow-Sort: 618 [msec]
[Timing] (Rank 1) Total : 2184 [msec]
[Timing] (Rank 1) Full-Sort : 911 [msec]
[Timing] (Rank 1) Exchange : 320 [msec]
[Timing] (Rank 1) Min-Max : 73 [msec]
[Timing] (Rank 1) Elbow-Sort: 619 [msec]
[Timing] (Rank 3) Total : 2022 [msec]
[Timing] (Rank 3) Full-Sort : 951 [msec]
[Timing] (Rank 3) Exchange : 125 [msec]
[Timing] (Rank 3) Min-Max : 74 [msec]
[Timing] (Rank 3) Elbow-Sort: 618 [msec]
@@ -0,0 +1,43 @@
Autoloading libnl/3.3.0
Autoloading numactl/2.0.14
Autoloading rdma-core/32.0
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading openssl/1.1.1h
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading singularity/3.6.4
[Timing] (Rank 2) Total : 8886 [msec]
[Timing] (Rank 2) Full-Sort : 3933 [msec]
[Timing] (Rank 2) Exchange : 1596 [msec]
[Timing] (Rank 2) Min-Max : 198 [msec]
[Timing] (Rank 2) Elbow-Sort: 2463 [msec]
[Timing] (Rank 0) Total : 9000 [msec]
[Timing] (Rank 0) Full-Sort : 3947 [msec]
[Timing] (Rank 0) Exchange : 1694 [msec]
[Timing] (Rank 0) Min-Max : 198 [msec]
[Timing] (Rank 0) Elbow-Sort: 2470 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 9038 [msec]
[Timing] (Rank 1) Full-Sort : 3991 [msec]
[Timing] (Rank 1) Exchange : 1256 [msec]
[Timing] (Rank 1) Min-Max : 294 [msec]
[Timing] (Rank 1) Elbow-Sort: 2467 [msec]
[Timing] (Rank 3) Total : 8285 [msec]
[Timing] (Rank 3) Full-Sort : 4049 [msec]
[Timing] (Rank 3) Exchange : 496 [msec]
[Timing] (Rank 3) Min-Max : 296 [msec]
[Timing] (Rank 3) Elbow-Sort: 2465 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 2) Total : 102 [msec]
[Timing] (Rank 2) Full-Sort : 24 [msec]
[Timing] (Rank 2) Exchange : 31 [msec]
[Timing] (Rank 2) Min-Max : 4676 [usec]
[Timing] (Rank 2) Elbow-Sort: 29 [msec]
[Timing] (Rank 6) Total : 98 [msec]
[Timing] (Rank 6) Full-Sort : 24 [msec]
[Timing] (Rank 6) Exchange : 27 [msec]
[Timing] (Rank 6) Min-Max : 4951 [usec]
[Timing] (Rank 6) Elbow-Sort: 28 [msec]
[Timing] (Rank 1) Total : 103 [msec]
[Timing] (Rank 1) Full-Sort : 23 [msec]
[Timing] (Rank 1) Exchange : 31 [msec]
[Timing] (Rank 1) Min-Max : 5509 [usec]
[Timing] (Rank 1) Elbow-Sort: 29 [msec]
[Timing] (Rank 0) Total : 103 [msec]
[Timing] (Rank 0) Full-Sort : 24 [msec]
[Timing] (Rank 0) Exchange : 37 [msec]
[Timing] (Rank 0) Min-Max : 3909 [usec]
[Timing] (Rank 0) Elbow-Sort: 29 [msec]
Results validation ... [PASS] 
[Timing] (Rank 3) Total : 89 [msec]
[Timing] (Rank 3) Full-Sort : 24 [msec]
[Timing] (Rank 3) Exchange : 15 [msec]
[Timing] (Rank 3) Min-Max : 5743 [usec]
[Timing] (Rank 3) Elbow-Sort: 29 [msec]
[Timing] (Rank 4) Total : 100 [msec]
[Timing] (Rank 4) Full-Sort : 23 [msec]
[Timing] (Rank 4) Exchange : 32 [msec]
[Timing] (Rank 4) Min-Max : 4737 [usec]
[Timing] (Rank 4) Elbow-Sort: 29 [msec]
[Timing] (Rank 5) Total : 100 [msec]
[Timing] (Rank 5) Full-Sort : 23 [msec]
[Timing] (Rank 5) Exchange : 31 [msec]
[Timing] (Rank 5) Min-Max : 4784 [usec]
[Timing] (Rank 5) Elbow-Sort: 28 [msec]
[Timing] (Rank 7) Total : 93 [msec]
[Timing] (Rank 7) Full-Sort : 24 [msec]
[Timing] (Rank 7) Exchange : 24 [msec]
[Timing] (Rank 7) Min-Max : 4736 [usec]
[Timing] (Rank 7) Elbow-Sort: 28 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 4) Total : 740 [msec]
[Timing] (Rank 4) Full-Sort : 213 [msec]
[Timing] (Rank 4) Exchange : 174 [msec]
[Timing] (Rank 4) Min-Max : 31 [msec]
[Timing] (Rank 4) Elbow-Sort: 232 [msec]
[Timing] (Rank 2) Total : 749 [msec]
[Timing] (Rank 2) Full-Sort : 215 [msec]
[Timing] (Rank 2) Exchange : 172 [msec]
[Timing] (Rank 2) Min-Max : 32 [msec]
[Timing] (Rank 2) Elbow-Sort: 232 [msec]
[Timing] (Rank 0) Total : 734 [msec]
[Timing] (Rank 0) Full-Sort : 212 [msec]
[Timing] (Rank 0) Exchange : 190 [msec]
[Timing] (Rank 0) Min-Max : 26 [msec]
[Timing] (Rank 0) Elbow-Sort: 233 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 749 [msec]
[Timing] (Rank 1) Full-Sort : 212 [msec]
[Timing] (Rank 1) Exchange : 174 [msec]
[Timing] (Rank 1) Min-Max : 31 [msec]
[Timing] (Rank 1) Elbow-Sort: 232 [msec]
[Timing] (Rank 3) Total : 708 [msec]
[Timing] (Rank 3) Full-Sort : 220 [msec]
[Timing] (Rank 3) Exchange : 69 [msec]
[Timing] (Rank 3) Min-Max : 64 [msec]
[Timing] (Rank 3) Elbow-Sort: 241 [msec]
[Timing] (Rank 6) Total : 734 [msec]
[Timing] (Rank 6) Full-Sort : 213 [msec]
[Timing] (Rank 6) Exchange : 148 [msec]
[Timing] (Rank 6) Min-Max : 37 [msec]
[Timing] (Rank 6) Elbow-Sort: 231 [msec]
[Timing] (Rank 7) Total : 700 [msec]
[Timing] (Rank 7) Full-Sort : 219 [msec]
[Timing] (Rank 7) Exchange : 121 [msec]
[Timing] (Rank 7) Min-Max : 35 [msec]
[Timing] (Rank 7) Elbow-Sort: 232 [msec]
[Timing] (Rank 5) Total : 729 [msec]
[Timing] (Rank 5) Full-Sort : 212 [msec]
[Timing] (Rank 5) Exchange : 179 [msec]
[Timing] (Rank 5) Min-Max : 25 [msec]
[Timing] (Rank 5) Elbow-Sort: 231 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 1) Total : 2951 [msec]
[Timing] (Rank 1) Full-Sort : 921 [msec]
[Timing] (Rank 1) Exchange : 583 [msec]
[Timing] (Rank 1) Min-Max : 123 [msec]
[Timing] (Rank 1) Elbow-Sort: 928 [msec]
[Timing] (Rank 4) Total : 2933 [msec]
[Timing] (Rank 4) Full-Sort : 918 [msec]
[Timing] (Rank 4) Exchange : 614 [msec]
[Timing] (Rank 4) Min-Max : 124 [msec]
[Timing] (Rank 4) Elbow-Sort: 924 [msec]
[Timing] (Rank 0) Total : 2982 [msec]
[Timing] (Rank 0) Full-Sort : 931 [msec]
[Timing] (Rank 0) Exchange : 813 [msec]
[Timing] (Rank 0) Min-Max : 74 [msec]
[Timing] (Rank 0) Elbow-Sort: 928 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 2953 [msec]
[Timing] (Rank 2) Full-Sort : 915 [msec]
[Timing] (Rank 2) Exchange : 700 [msec]
[Timing] (Rank 2) Min-Max : 99 [msec]
[Timing] (Rank 2) Elbow-Sort: 930 [msec]
[Timing] (Rank 3) Total : 2751 [msec]
[Timing] (Rank 3) Full-Sort : 951 [msec]
[Timing] (Rank 3) Exchange : 279 [msec]
[Timing] (Rank 3) Min-Max : 148 [msec]
[Timing] (Rank 3) Elbow-Sort: 930 [msec]
[Timing] (Rank 5) Total : 2970 [msec]
[Timing] (Rank 5) Full-Sort : 927 [msec]
[Timing] (Rank 5) Exchange : 628 [msec]
[Timing] (Rank 5) Min-Max : 123 [msec]
[Timing] (Rank 5) Elbow-Sort: 923 [msec]
[Timing] (Rank 6) Total : 2935 [msec]
[Timing] (Rank 6) Full-Sort : 928 [msec]
[Timing] (Rank 6) Exchange : 532 [msec]
[Timing] (Rank 6) Min-Max : 149 [msec]
[Timing] (Rank 6) Elbow-Sort: 921 [msec]
[Timing] (Rank 7) Total : 2822 [msec]
[Timing] (Rank 7) Full-Sort : 940 [msec]
[Timing] (Rank 7) Exchange : 387 [msec]
[Timing] (Rank 7) Min-Max : 148 [msec]
[Timing] (Rank 7) Elbow-Sort: 920 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 6) Total : 11 [sec]
[Timing] (Rank 6) Full-Sort : 3945 [msec]
[Timing] (Rank 6) Exchange : 1903 [msec]
[Timing] (Rank 6) Min-Max : 591 [msec]
[Timing] (Rank 6) Elbow-Sort: 3716 [msec]
[Timing] (Rank 1) Total : 11 [sec]
[Timing] (Rank 1) Full-Sort : 3962 [msec]
[Timing] (Rank 1) Exchange : 2090 [msec]
[Timing] (Rank 1) Min-Max : 491 [msec]
[Timing] (Rank 1) Elbow-Sort: 3724 [msec]
[Timing] (Rank 4) Total : 11 [sec]
[Timing] (Rank 4) Full-Sort : 3936 [msec]
[Timing] (Rank 4) Exchange : 2192 [msec]
[Timing] (Rank 4) Min-Max : 494 [msec]
[Timing] (Rank 4) Elbow-Sort: 3710 [msec]
[Timing] (Rank 7) Total : 11 [sec]
[Timing] (Rank 7) Full-Sort : 4041 [msec]
[Timing] (Rank 7) Exchange : 1799 [msec]
[Timing] (Rank 7) Min-Max : 395 [msec]
[Timing] (Rank 7) Elbow-Sort: 3708 [msec]
[Timing] (Rank 5) Total : 11 [sec]
[Timing] (Rank 5) Full-Sort : 3954 [msec]
[Timing] (Rank 5) Exchange : 2773 [msec]
[Timing] (Rank 5) Min-Max : 294 [msec]
[Timing] (Rank 5) Elbow-Sort: 3705 [msec]
[Timing] (Rank 2) Total : 11 [sec]
[Timing] (Rank 2) Full-Sort : 3963 [msec]
[Timing] (Rank 2) Exchange : 2245 [msec]
[Timing] (Rank 2) Min-Max : 498 [msec]
[Timing] (Rank 2) Elbow-Sort: 3741 [msec]
[Timing] (Rank 3) Total : 11 [sec]
[Timing] (Rank 3) Full-Sort : 4049 [msec]
[Timing] (Rank 3) Exchange : 1161 [msec]
[Timing] (Rank 3) Min-Max : 590 [msec]
[Timing] (Rank 3) Elbow-Sort: 3731 [msec]
[Timing] (Rank 0) Total : 11 [sec]
[Timing] (Rank 0) Full-Sort : 3949 [msec]
[Timing] (Rank 0) Exchange : 2590 [msec]
[Timing] (Rank 0) Min-Max : 398 [msec]
[Timing] (Rank 0) Elbow-Sort: 3726 [msec]
Results validation ... [PASS] 
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 191 [msec]
[Timing] (Rank 0) Full-Sort : 48 [msec]
[Timing] (Rank 0) Exchange : 134 [msec]
[Timing] (Rank 0) Min-Max : 1539 [usec]
[Timing] (Rank 0) Elbow-Sort: 4774 [usec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 191 [msec]
[Timing] (Rank 1) Full-Sort : 97 [msec]
[Timing] (Rank 1) Exchange : 84 [msec]
[Timing] (Rank 1) Min-Max : 1582 [usec]
[Timing] (Rank 1) Elbow-Sort: 4748 [usec]
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 333 [msec]
[Timing] (Rank 0) Full-Sort : 200 [msec]
[Timing] (Rank 0) Exchange : 52 [msec]
[Timing] (Rank 0) Min-Max : 16 [msec]
[Timing] (Rank 0) Elbow-Sort: 42 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 332 [msec]
[Timing] (Rank 1) Full-Sort : 196 [msec]
[Timing] (Rank 1) Exchange : 51 [msec]
[Timing] (Rank 1) Min-Max : 16 [msec]
[Timing] (Rank 1) Elbow-Sort: 41 [msec]
@@ -0,0 +1,32 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 1333 [msec]
[Timing] (Rank 0) Full-Sort : 859 [msec]
[Timing] (Rank 0) Exchange : 141 [msec]
[Timing] (Rank 0) Min-Max : 62 [msec]
[Timing] (Rank 0) Elbow-Sort: 176 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 1337 [msec]
[Timing] (Rank 1) Full-Sort : 841 [msec]
[Timing] (Rank 1) Exchange : 142 [msec]
[Timing] (Rank 1) Min-Max : 63 [msec]
[Timing] (Rank 1) Elbow-Sort: 178 [msec]
@@ -0,0 +1,45 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading squashfs/4.4
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading shadow/4.7
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading popt/1.16
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading json-c/0.13.1
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading pkgconf/1.7.3
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
Autoloading openssl/1.1.1h
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
systemd-cat: symbol lookup error: /usr/lib64/systemd/libsystemd-shared-252.so: undefined symbol: seccomp_api_get
[Timing] (Rank 1) Total : 4898 [msec]
[Timing] (Rank 1) Full-Sort : 3456 [msec]
[Timing] (Rank 1) Exchange : 196 [msec]
[Timing] (Rank 1) Min-Max : 177 [msec]
[Timing] (Rank 1) Elbow-Sort: 659 [msec]
[Timing] (Rank 0) Total : 4915 [msec]
[Timing] (Rank 0) Full-Sort : 3581 [msec]
[Timing] (Rank 0) Exchange : 167 [msec]
[Timing] (Rank 0) Min-Max : 181 [msec]
[Timing] (Rank 0) Elbow-Sort: 663 [msec]
Results validation ... [PASS] 
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 1) Total : 49 [msec]
[Timing] (Rank 1) Full-Sort : 22 [msec]
[Timing] (Rank 1) Exchange : 5706 [usec]
[Timing] (Rank 1) Min-Max : 3424 [usec]
[Timing] (Rank 1) Elbow-Sort: 11 [msec]
[Timing] (Rank 0) Total : 49 [msec]
[Timing] (Rank 0) Full-Sort : 22 [msec]
[Timing] (Rank 0) Exchange : 9189 [usec]
[Timing] (Rank 0) Min-Max : 2239 [usec]
[Timing] (Rank 0) Elbow-Sort: 11 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 49 [msec]
[Timing] (Rank 2) Full-Sort : 23 [msec]
[Timing] (Rank 2) Exchange : 8656 [usec]
[Timing] (Rank 2) Min-Max : 2298 [usec]
[Timing] (Rank 2) Elbow-Sort: 10 [msec]
[Timing] (Rank 3) Total : 48 [msec]
[Timing] (Rank 3) Full-Sort : 22 [msec]
[Timing] (Rank 3) Exchange : 6006 [usec]
[Timing] (Rank 3) Min-Max : 3631 [usec]
[Timing] (Rank 3) Elbow-Sort: 10 [msec]
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 2) Total : 425 [msec]
[Timing] (Rank 2) Full-Sort : 215 [msec]
[Timing] (Rank 2) Exchange : 63 [msec]
[Timing] (Rank 2) Min-Max : 22 [msec]
[Timing] (Rank 2) Elbow-Sort: 88 [msec]
[Timing] (Rank 3) Total : 428 [msec]
[Timing] (Rank 3) Full-Sort : 210 [msec]
[Timing] (Rank 3) Exchange : 44 [msec]
[Timing] (Rank 3) Min-Max : 30 [msec]
[Timing] (Rank 3) Elbow-Sort: 91 [msec]
[Timing] (Rank 1) Total : 435 [msec]
[Timing] (Rank 1) Full-Sort : 210 [msec]
[Timing] (Rank 1) Exchange : 45 [msec]
[Timing] (Rank 1) Min-Max : 29 [msec]
[Timing] (Rank 1) Elbow-Sort: 92 [msec]
[Timing] (Rank 0) Total : 434 [msec]
[Timing] (Rank 0) Full-Sort : 217 [msec]
[Timing] (Rank 0) Exchange : 67 [msec]
[Timing] (Rank 0) Min-Max : 21 [msec]
[Timing] (Rank 0) Elbow-Sort: 92 [msec]
Results validation ... [PASS] 
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 0) Total : 1759 [msec]
[Timing] (Rank 0) Full-Sort : 941 [msec]
[Timing] (Rank 0) Exchange : 222 [msec]
[Timing] (Rank 0) Min-Max : 84 [msec]
[Timing] (Rank 0) Elbow-Sort: 372 [msec]
Results validation ... [PASS] 
[Timing] (Rank 3) Total : 1736 [msec]
[Timing] (Rank 3) Full-Sort : 904 [msec]
[Timing] (Rank 3) Exchange : 140 [msec]
[Timing] (Rank 3) Min-Max : 128 [msec]
[Timing] (Rank 3) Elbow-Sort: 362 [msec]
[Timing] (Rank 1) Total : 1757 [msec]
[Timing] (Rank 1) Full-Sort : 903 [msec]
[Timing] (Rank 1) Exchange : 130 [msec]
[Timing] (Rank 1) Min-Max : 129 [msec]
[Timing] (Rank 1) Elbow-Sort: 369 [msec]
[Timing] (Rank 2) Total : 1727 [msec]
[Timing] (Rank 2) Full-Sort : 945 [msec]
[Timing] (Rank 2) Exchange : 202 [msec]
[Timing] (Rank 2) Min-Max : 83 [msec]
[Timing] (Rank 2) Elbow-Sort: 360 [msec]
@@ -0,0 +1,42 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 2) Total : 7075 [msec]
[Timing] (Rank 2) Full-Sort : 4050 [msec]
[Timing] (Rank 2) Exchange : 713 [msec]
[Timing] (Rank 2) Min-Max : 317 [msec]
[Timing] (Rank 2) Elbow-Sort: 1453 [msec]
[Timing] (Rank 3) Total : 7107 [msec]
[Timing] (Rank 3) Full-Sort : 3872 [msec]
[Timing] (Rank 3) Exchange : 507 [msec]
[Timing] (Rank 3) Min-Max : 464 [msec]
[Timing] (Rank 3) Elbow-Sort: 1470 [msec]
[Timing] (Rank 1) Total : 7195 [msec]
[Timing] (Rank 1) Full-Sort : 3896 [msec]
[Timing] (Rank 1) Exchange : 417 [msec]
[Timing] (Rank 1) Min-Max : 456 [msec]
[Timing] (Rank 1) Elbow-Sort: 1530 [msec]
[Timing] (Rank 0) Total : 7178 [msec]
[Timing] (Rank 0) Full-Sort : 4049 [msec]
[Timing] (Rank 0) Exchange : 767 [msec]
[Timing] (Rank 0) Min-Max : 315 [msec]
[Timing] (Rank 0) Elbow-Sort: 1504 [msec]
Results validation ... [PASS] 
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 6) Total : 70 [msec]
[Timing] (Rank 6) Full-Sort : 19 [msec]
[Timing] (Rank 6) Exchange : 22 [msec]
[Timing] (Rank 6) Min-Max : 5863 [usec]
[Timing] (Rank 6) Elbow-Sort: 13 [msec]
[Timing] (Rank 3) Total : 71 [msec]
[Timing] (Rank 3) Full-Sort : 22 [msec]
[Timing] (Rank 3) Exchange : 14 [msec]
[Timing] (Rank 3) Min-Max : 6790 [usec]
[Timing] (Rank 3) Elbow-Sort: 16 [msec]
[Timing] (Rank 0) Total : 72 [msec]
[Timing] (Rank 0) Full-Sort : 23 [msec]
[Timing] (Rank 0) Exchange : 21 [msec]
[Timing] (Rank 0) Min-Max : 4246 [usec]
[Timing] (Rank 0) Elbow-Sort: 16 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 72 [msec]
[Timing] (Rank 1) Full-Sort : 22 [msec]
[Timing] (Rank 1) Exchange : 14 [msec]
[Timing] (Rank 1) Min-Max : 6672 [usec]
[Timing] (Rank 1) Elbow-Sort: 16 [msec]
[Timing] (Rank 2) Total : 71 [msec]
[Timing] (Rank 2) Full-Sort : 23 [msec]
[Timing] (Rank 2) Exchange : 16 [msec]
[Timing] (Rank 2) Min-Max : 5789 [usec]
[Timing] (Rank 2) Elbow-Sort: 16 [msec]
[Timing] (Rank 5) Total : 69 [msec]
[Timing] (Rank 5) Full-Sort : 19 [msec]
[Timing] (Rank 5) Exchange : 25 [msec]
[Timing] (Rank 5) Min-Max : 3807 [usec]
[Timing] (Rank 5) Elbow-Sort: 14 [msec]
[Timing] (Rank 7) Total : 70 [msec]
[Timing] (Rank 7) Full-Sort : 18 [msec]
[Timing] (Rank 7) Exchange : 27 [msec]
[Timing] (Rank 7) Min-Max : 3917 [usec]
[Timing] (Rank 7) Elbow-Sort: 13 [msec]
[Timing] (Rank 4) Total : 70 [msec]
[Timing] (Rank 4) Full-Sort : 20 [msec]
[Timing] (Rank 4) Exchange : 22 [msec]
[Timing] (Rank 4) Min-Max : 4694 [usec]
[Timing] (Rank 4) Elbow-Sort: 14 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 5) Total : 563 [msec]
[Timing] (Rank 5) Full-Sort : 175 [msec]
[Timing] (Rank 5) Exchange : 182 [msec]
[Timing] (Rank 5) Min-Max : 30 [msec]
[Timing] (Rank 5) Elbow-Sort: 116 [msec]
[Timing] (Rank 3) Total : 581 [msec]
[Timing] (Rank 3) Full-Sort : 207 [msec]
[Timing] (Rank 3) Exchange : 89 [msec]
[Timing] (Rank 3) Min-Max : 54 [msec]
[Timing] (Rank 3) Elbow-Sort: 139 [msec]
[Timing] (Rank 6) Total : 570 [msec]
[Timing] (Rank 6) Full-Sort : 179 [msec]
[Timing] (Rank 6) Exchange : 161 [msec]
[Timing] (Rank 6) Min-Max : 45 [msec]
[Timing] (Rank 6) Elbow-Sort: 115 [msec]
[Timing] (Rank 7) Total : 569 [msec]
[Timing] (Rank 7) Full-Sort : 175 [msec]
[Timing] (Rank 7) Exchange : 194 [msec]
[Timing] (Rank 7) Min-Max : 31 [msec]
[Timing] (Rank 7) Elbow-Sort: 115 [msec]
[Timing] (Rank 4) Total : 565 [msec]
[Timing] (Rank 4) Full-Sort : 183 [msec]
[Timing] (Rank 4) Exchange : 161 [msec]
[Timing] (Rank 4) Min-Max : 37 [msec]
[Timing] (Rank 4) Elbow-Sort: 119 [msec]
[Timing] (Rank 0) Total : 581 [msec]
[Timing] (Rank 0) Full-Sort : 214 [msec]
[Timing] (Rank 0) Exchange : 132 [msec]
[Timing] (Rank 0) Min-Max : 35 [msec]
[Timing] (Rank 0) Elbow-Sort: 141 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 580 [msec]
[Timing] (Rank 2) Full-Sort : 215 [msec]
[Timing] (Rank 2) Exchange : 102 [msec]
[Timing] (Rank 2) Min-Max : 45 [msec]
[Timing] (Rank 2) Elbow-Sort: 137 [msec]
[Timing] (Rank 1) Total : 580 [msec]
[Timing] (Rank 1) Full-Sort : 207 [msec]
[Timing] (Rank 1) Exchange : 86 [msec]
[Timing] (Rank 1) Min-Max : 54 [msec]
[Timing] (Rank 1) Elbow-Sort: 136 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 6) Total : 2315 [msec]
[Timing] (Rank 6) Full-Sort : 775 [msec]
[Timing] (Rank 6) Exchange : 599 [msec]
[Timing] (Rank 6) Min-Max : 201 [msec]
[Timing] (Rank 6) Elbow-Sort: 463 [msec]
[Timing] (Rank 3) Total : 2346 [msec]
[Timing] (Rank 3) Full-Sort : 893 [msec]
[Timing] (Rank 3) Exchange : 297 [msec]
[Timing] (Rank 3) Min-Max : 254 [msec]
[Timing] (Rank 3) Elbow-Sort: 553 [msec]
[Timing] (Rank 4) Total : 2327 [msec]
[Timing] (Rank 4) Full-Sort : 803 [msec]
[Timing] (Rank 4) Exchange : 623 [msec]
[Timing] (Rank 4) Min-Max : 164 [msec]
[Timing] (Rank 4) Elbow-Sort: 477 [msec]
[Timing] (Rank 5) Total : 2320 [msec]
[Timing] (Rank 5) Full-Sort : 745 [msec]
[Timing] (Rank 5) Exchange : 673 [msec]
[Timing] (Rank 5) Min-Max : 166 [msec]
[Timing] (Rank 5) Elbow-Sort: 470 [msec]
[Timing] (Rank 7) Total : 2315 [msec]
[Timing] (Rank 7) Full-Sort : 744 [msec]
[Timing] (Rank 7) Exchange : 604 [msec]
[Timing] (Rank 7) Min-Max : 199 [msec]
[Timing] (Rank 7) Elbow-Sort: 466 [msec]
[Timing] (Rank 0) Total : 2362 [msec]
[Timing] (Rank 0) Full-Sort : 934 [msec]
[Timing] (Rank 0) Exchange : 565 [msec]
[Timing] (Rank 0) Min-Max : 120 [msec]
[Timing] (Rank 0) Elbow-Sort: 556 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 2363 [msec]
[Timing] (Rank 1) Full-Sort : 901 [msec]
[Timing] (Rank 1) Exchange : 353 [msec]
[Timing] (Rank 1) Min-Max : 204 [msec]
[Timing] (Rank 1) Elbow-Sort: 568 [msec]
[Timing] (Rank 2) Total : 2340 [msec]
[Timing] (Rank 2) Full-Sort : 937 [msec]
[Timing] (Rank 2) Exchange : 436 [msec]
[Timing] (Rank 2) Min-Max : 171 [msec]
[Timing] (Rank 2) Elbow-Sort: 547 [msec]
@@ -0,0 +1,62 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 5) Total : 9497 [msec]
[Timing] (Rank 5) Full-Sort : 3219 [msec]
[Timing] (Rank 5) Exchange : 2950 [msec]
[Timing] (Rank 5) Min-Max : 486 [msec]
[Timing] (Rank 5) Elbow-Sort: 1906 [msec]
[Timing] (Rank 0) Total : 9670 [msec]
[Timing] (Rank 0) Full-Sort : 4061 [msec]
[Timing] (Rank 0) Exchange : 1793 [msec]
[Timing] (Rank 0) Min-Max : 674 [msec]
[Timing] (Rank 0) Elbow-Sort: 2252 [msec]
Results validation ... [PASS] 
[Timing] (Rank 6) Total : 9511 [msec]
[Timing] (Rank 6) Full-Sort : 3373 [msec]
[Timing] (Rank 6) Exchange : 2429 [msec]
[Timing] (Rank 6) Min-Max : 738 [msec]
[Timing] (Rank 6) Elbow-Sort: 1866 [msec]
[Timing] (Rank 7) Total : 9506 [msec]
[Timing] (Rank 7) Full-Sort : 3210 [msec]
[Timing] (Rank 7) Exchange : 2838 [msec]
[Timing] (Rank 7) Min-Max : 612 [msec]
[Timing] (Rank 7) Elbow-Sort: 1873 [msec]
[Timing] (Rank 4) Total : 9545 [msec]
[Timing] (Rank 4) Full-Sort : 3445 [msec]
[Timing] (Rank 4) Exchange : 2548 [msec]
[Timing] (Rank 4) Min-Max : 601 [msec]
[Timing] (Rank 4) Elbow-Sort: 1928 [msec]
[Timing] (Rank 3) Total : 9587 [msec]
[Timing] (Rank 3) Full-Sort : 3917 [msec]
[Timing] (Rank 3) Exchange : 1076 [msec]
[Timing] (Rank 3) Min-Max : 988 [msec]
[Timing] (Rank 3) Elbow-Sort: 2214 [msec]
[Timing] (Rank 1) Total : 9658 [msec]
[Timing] (Rank 1) Full-Sort : 3922 [msec]
[Timing] (Rank 1) Exchange : 1326 [msec]
[Timing] (Rank 1) Min-Max : 832 [msec]
[Timing] (Rank 1) Elbow-Sort: 2241 [msec]
[Timing] (Rank 2) Total : 9578 [msec]
[Timing] (Rank 2) Full-Sort : 4070 [msec]
[Timing] (Rank 2) Exchange : 1248 [msec]
[Timing] (Rank 2) Min-Max : 837 [msec]
[Timing] (Rank 2) Elbow-Sort: 2190 [msec]
@@ -0,0 +1,342 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 34) Total : 192 [msec]
[Timing] (Rank 34) Full-Sort : 20 [msec]
[Timing] (Rank 34) Exchange : 95 [msec]
[Timing] (Rank 34) Min-Max : 23 [msec]
[Timing] (Rank 34) Elbow-Sort: 27 [msec]
[Timing] (Rank 33) Total : 192 [msec]
[Timing] (Rank 33) Full-Sort : 19 [msec]
[Timing] (Rank 33) Exchange : 99 [msec]
[Timing] (Rank 33) Min-Max : 22 [msec]
[Timing] (Rank 33) Elbow-Sort: 28 [msec]
[Timing] (Rank 42) Total : 190 [msec]
[Timing] (Rank 42) Full-Sort : 20 [msec]
[Timing] (Rank 42) Exchange : 110 [msec]
[Timing] (Rank 42) Min-Max : 15 [msec]
[Timing] (Rank 42) Elbow-Sort: 27 [msec]
[Timing] (Rank 41) Total : 189 [msec]
[Timing] (Rank 41) Full-Sort : 20 [msec]
[Timing] (Rank 41) Exchange : 96 [msec]
[Timing] (Rank 41) Min-Max : 23 [msec]
[Timing] (Rank 41) Elbow-Sort: 27 [msec]
[Timing] (Rank 35) Total : 193 [msec]
[Timing] (Rank 35) Full-Sort : 19 [msec]
[Timing] (Rank 35) Exchange : 95 [msec]
[Timing] (Rank 35) Min-Max : 25 [msec]
[Timing] (Rank 35) Elbow-Sort: 28 [msec]
[Timing] (Rank 38) Total : 192 [msec]
[Timing] (Rank 38) Full-Sort : 20 [msec]
[Timing] (Rank 38) Exchange : 90 [msec]
[Timing] (Rank 38) Min-Max : 27 [msec]
[Timing] (Rank 38) Elbow-Sort: 27 [msec]
[Timing] (Rank 43) Total : 190 [msec]
[Timing] (Rank 43) Full-Sort : 20 [msec]
[Timing] (Rank 43) Exchange : 107 [msec]
[Timing] (Rank 43) Min-Max : 16 [msec]
[Timing] (Rank 43) Elbow-Sort: 27 [msec]
[Timing] (Rank 44) Total : 191 [msec]
[Timing] (Rank 44) Full-Sort : 20 [msec]
[Timing] (Rank 44) Exchange : 95 [msec]
[Timing] (Rank 44) Min-Max : 22 [msec]
[Timing] (Rank 44) Elbow-Sort: 27 [msec]
[Timing] (Rank 18) Total : 201 [msec]
[Timing] (Rank 18) Full-Sort : 20 [msec]
[Timing] (Rank 18) Exchange : 100 [msec]
[Timing] (Rank 18) Min-Max : 27 [msec]
[Timing] (Rank 18) Elbow-Sort: 27 [msec]
[Timing] (Rank 45) Total : 188 [msec]
[Timing] (Rank 45) Full-Sort : 19 [msec]
[Timing] (Rank 45) Exchange : 99 [msec]
[Timing] (Rank 45) Min-Max : 18 [msec]
[Timing] (Rank 45) Elbow-Sort: 27 [msec]
[Timing] (Rank 36) Total : 189 [msec]
[Timing] (Rank 36) Full-Sort : 20 [msec]
[Timing] (Rank 36) Exchange : 96 [msec]
[Timing] (Rank 36) Min-Max : 22 [msec]
[Timing] (Rank 36) Elbow-Sort: 27 [msec]
[Timing] (Rank 46) Total : 191 [msec]
[Timing] (Rank 46) Full-Sort : 20 [msec]
[Timing] (Rank 46) Exchange : 97 [msec]
[Timing] (Rank 46) Min-Max : 22 [msec]
[Timing] (Rank 46) Elbow-Sort: 27 [msec]
[Timing] (Rank 37) Total : 191 [msec]
[Timing] (Rank 37) Full-Sort : 20 [msec]
[Timing] (Rank 37) Exchange : 96 [msec]
[Timing] (Rank 37) Min-Max : 23 [msec]
[Timing] (Rank 37) Elbow-Sort: 27 [msec]
[Timing] (Rank 40) Total : 190 [msec]
[Timing] (Rank 40) Full-Sort : 20 [msec]
[Timing] (Rank 40) Exchange : 103 [msec]
[Timing] (Rank 40) Min-Max : 21 [msec]
[Timing] (Rank 40) Elbow-Sort: 28 [msec]
[Timing] (Rank 47) Total : 192 [msec]
[Timing] (Rank 47) Full-Sort : 19 [msec]
[Timing] (Rank 47) Exchange : 110 [msec]
[Timing] (Rank 47) Min-Max : 15 [msec]
[Timing] (Rank 47) Elbow-Sort: 27 [msec]
[Timing] (Rank 54) Total : 193 [msec]
[Timing] (Rank 54) Full-Sort : 20 [msec]
[Timing] (Rank 54) Exchange : 101 [msec]
[Timing] (Rank 54) Min-Max : 20 [msec]
[Timing] (Rank 54) Elbow-Sort: 27 [msec]
[Timing] (Rank 39) Total : 191 [msec]
[Timing] (Rank 39) Full-Sort : 20 [msec]
[Timing] (Rank 39) Exchange : 99 [msec]
[Timing] (Rank 39) Min-Max : 20 [msec]
[Timing] (Rank 39) Elbow-Sort: 27 [msec]
[Timing] (Rank 13) Total : 199 [msec]
[Timing] (Rank 13) Full-Sort : 20 [msec]
[Timing] (Rank 13) Exchange : 103 [msec]
[Timing] (Rank 13) Min-Max : 20 [msec]
[Timing] (Rank 13) Elbow-Sort: 27 [msec]
[Timing] (Rank 32) Total : 192 [msec]
[Timing] (Rank 32) Full-Sort : 21 [msec]
[Timing] (Rank 32) Exchange : 105 [msec]
[Timing] (Rank 32) Min-Max : 18 [msec]
[Timing] (Rank 32) Elbow-Sort: 29 [msec]
[Timing] (Rank 20) Total : 200 [msec]
[Timing] (Rank 20) Full-Sort : 20 [msec]
[Timing] (Rank 20) Exchange : 105 [msec]
[Timing] (Rank 20) Min-Max : 25 [msec]
[Timing] (Rank 20) Elbow-Sort: 28 [msec]
[Timing] (Rank 26) Total : 200 [msec]
[Timing] (Rank 26) Full-Sort : 20 [msec]
[Timing] (Rank 26) Exchange : 100 [msec]
[Timing] (Rank 26) Min-Max : 27 [msec]
[Timing] (Rank 26) Elbow-Sort: 27 [msec]
[Timing] (Rank 31) Total : 200 [msec]
[Timing] (Rank 31) Full-Sort : 19 [msec]
[Timing] (Rank 31) Exchange : 117 [msec]
[Timing] (Rank 31) Min-Max : 17 [msec]
[Timing] (Rank 31) Elbow-Sort: 27 [msec]
[Timing] (Rank 19) Total : 200 [msec]
[Timing] (Rank 19) Full-Sort : 19 [msec]
[Timing] (Rank 19) Exchange : 94 [msec]
[Timing] (Rank 19) Min-Max : 31 [msec]
[Timing] (Rank 19) Elbow-Sort: 28 [msec]
[Timing] (Rank 22) Total : 201 [msec]
[Timing] (Rank 22) Full-Sort : 20 [msec]
[Timing] (Rank 22) Exchange : 101 [msec]
[Timing] (Rank 22) Min-Max : 28 [msec]
[Timing] (Rank 22) Elbow-Sort: 28 [msec]
[Timing] (Rank 27) Total : 199 [msec]
[Timing] (Rank 27) Full-Sort : 19 [msec]
[Timing] (Rank 27) Exchange : 102 [msec]
[Timing] (Rank 27) Min-Max : 25 [msec]
[Timing] (Rank 27) Elbow-Sort: 27 [msec]
[Timing] (Rank 30) Total : 200 [msec]
[Timing] (Rank 30) Full-Sort : 20 [msec]
[Timing] (Rank 30) Exchange : 105 [msec]
[Timing] (Rank 30) Min-Max : 25 [msec]
[Timing] (Rank 30) Elbow-Sort: 27 [msec]
[Timing] (Rank 24) Total : 200 [msec]
[Timing] (Rank 24) Full-Sort : 20 [msec]
[Timing] (Rank 24) Exchange : 92 [msec]
[Timing] (Rank 24) Min-Max : 33 [msec]
[Timing] (Rank 24) Elbow-Sort: 28 [msec]
[Timing] (Rank 29) Total : 199 [msec]
[Timing] (Rank 29) Full-Sort : 19 [msec]
[Timing] (Rank 29) Exchange : 104 [msec]
[Timing] (Rank 29) Min-Max : 25 [msec]
[Timing] (Rank 29) Elbow-Sort: 27 [msec]
[Timing] (Rank 16) Total : 201 [msec]
[Timing] (Rank 16) Full-Sort : 20 [msec]
[Timing] (Rank 16) Exchange : 113 [msec]
[Timing] (Rank 16) Min-Max : 21 [msec]
[Timing] (Rank 16) Elbow-Sort: 28 [msec]
[Timing] (Rank 23) Total : 200 [msec]
[Timing] (Rank 23) Full-Sort : 19 [msec]
[Timing] (Rank 23) Exchange : 109 [msec]
[Timing] (Rank 23) Min-Max : 24 [msec]
[Timing] (Rank 23) Elbow-Sort: 27 [msec]
[Timing] (Rank 28) Total : 199 [msec]
[Timing] (Rank 28) Full-Sort : 20 [msec]
[Timing] (Rank 28) Exchange : 88 [msec]
[Timing] (Rank 28) Min-Max : 34 [msec]
[Timing] (Rank 28) Elbow-Sort: 27 [msec]
[Timing] (Rank 21) Total : 200 [msec]
[Timing] (Rank 21) Full-Sort : 19 [msec]
[Timing] (Rank 21) Exchange : 117 [msec]
[Timing] (Rank 21) Min-Max : 17 [msec]
[Timing] (Rank 21) Elbow-Sort: 28 [msec]
[Timing] (Rank 17) Total : 201 [msec]
[Timing] (Rank 17) Full-Sort : 19 [msec]
[Timing] (Rank 17) Exchange : 103 [msec]
[Timing] (Rank 17) Min-Max : 26 [msec]
[Timing] (Rank 17) Elbow-Sort: 28 [msec]
[Timing] (Rank 25) Total : 199 [msec]
[Timing] (Rank 25) Full-Sort : 19 [msec]
[Timing] (Rank 25) Exchange : 87 [msec]
[Timing] (Rank 25) Min-Max : 33 [msec]
[Timing] (Rank 25) Elbow-Sort: 27 [msec]
[Timing] (Rank 11) Total : 197 [msec]
[Timing] (Rank 11) Full-Sort : 20 [msec]
[Timing] (Rank 11) Exchange : 111 [msec]
[Timing] (Rank 11) Min-Max : 17 [msec]
[Timing] (Rank 11) Elbow-Sort: 28 [msec]
[Timing] (Rank 0) Total : 198 [msec]
[Timing] (Rank 0) Full-Sort : 21 [msec]
[Timing] (Rank 0) Exchange : 131 [msec]
[Timing] (Rank 0) Min-Max : 7090 [usec]
[Timing] (Rank 0) Elbow-Sort: 28 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 199 [msec]
[Timing] (Rank 1) Full-Sort : 20 [msec]
[Timing] (Rank 1) Exchange : 116 [msec]
[Timing] (Rank 1) Min-Max : 13 [msec]
[Timing] (Rank 1) Elbow-Sort: 28 [msec]
[Timing] (Rank 3) Total : 198 [msec]
[Timing] (Rank 3) Full-Sort : 19 [msec]
[Timing] (Rank 3) Exchange : 109 [msec]
[Timing] (Rank 3) Min-Max : 19 [msec]
[Timing] (Rank 3) Elbow-Sort: 28 [msec]
[Timing] (Rank 7) Total : 198 [msec]
[Timing] (Rank 7) Full-Sort : 20 [msec]
[Timing] (Rank 7) Exchange : 113 [msec]
[Timing] (Rank 7) Min-Max : 15 [msec]
[Timing] (Rank 7) Elbow-Sort: 27 [msec]
[Timing] (Rank 10) Total : 197 [msec]
[Timing] (Rank 10) Full-Sort : 21 [msec]
[Timing] (Rank 10) Exchange : 115 [msec]
[Timing] (Rank 10) Min-Max : 14 [msec]
[Timing] (Rank 10) Elbow-Sort: 28 [msec]
[Timing] (Rank 60) Total : 194 [msec]
[Timing] (Rank 60) Full-Sort : 20 [msec]
[Timing] (Rank 60) Exchange : 90 [msec]
[Timing] (Rank 60) Min-Max : 28 [msec]
[Timing] (Rank 60) Elbow-Sort: 27 [msec]
[Timing] (Rank 57) Total : 194 [msec]
[Timing] (Rank 57) Full-Sort : 20 [msec]
[Timing] (Rank 57) Exchange : 95 [msec]
[Timing] (Rank 57) Min-Max : 23 [msec]
[Timing] (Rank 57) Elbow-Sort: 27 [msec]
[Timing] (Rank 14) Total : 199 [msec]
[Timing] (Rank 14) Full-Sort : 21 [msec]
[Timing] (Rank 14) Exchange : 105 [msec]
[Timing] (Rank 14) Min-Max : 20 [msec]
[Timing] (Rank 14) Elbow-Sort: 27 [msec]
[Timing] (Rank 8) Total : 198 [msec]
[Timing] (Rank 8) Full-Sort : 21 [msec]
[Timing] (Rank 8) Exchange : 112 [msec]
[Timing] (Rank 8) Min-Max : 18 [msec]
[Timing] (Rank 8) Elbow-Sort: 27 [msec]
[Timing] (Rank 2) Total : 198 [msec]
[Timing] (Rank 2) Full-Sort : 21 [msec]
[Timing] (Rank 2) Exchange : 118 [msec]
[Timing] (Rank 2) Min-Max : 13 [msec]
[Timing] (Rank 2) Elbow-Sort: 27 [msec]
[Timing] (Rank 63) Total : 194 [msec]
[Timing] (Rank 63) Full-Sort : 19 [msec]
[Timing] (Rank 63) Exchange : 114 [msec]
[Timing] (Rank 63) Min-Max : 15 [msec]
[Timing] (Rank 63) Elbow-Sort: 27 [msec]
[Timing] (Rank 4) Total : 198 [msec]
[Timing] (Rank 4) Full-Sort : 21 [msec]
[Timing] (Rank 4) Exchange : 111 [msec]
[Timing] (Rank 4) Min-Max : 16 [msec]
[Timing] (Rank 4) Elbow-Sort: 28 [msec]
[Timing] (Rank 5) Total : 198 [msec]
[Timing] (Rank 5) Full-Sort : 20 [msec]
[Timing] (Rank 5) Exchange : 110 [msec]
[Timing] (Rank 5) Min-Max : 16 [msec]
[Timing] (Rank 5) Elbow-Sort: 29 [msec]
[Timing] (Rank 53) Total : 193 [msec]
[Timing] (Rank 53) Full-Sort : 20 [msec]
[Timing] (Rank 53) Exchange : 112 [msec]
[Timing] (Rank 53) Min-Max : 14 [msec]
[Timing] (Rank 53) Elbow-Sort: 27 [msec]
[Timing] (Rank 58) Total : 193 [msec]
[Timing] (Rank 58) Full-Sort : 21 [msec]
[Timing] (Rank 58) Exchange : 106 [msec]
[Timing] (Rank 58) Min-Max : 19 [msec]
[Timing] (Rank 58) Elbow-Sort: 27 [msec]
[Timing] (Rank 6) Total : 198 [msec]
[Timing] (Rank 6) Full-Sort : 21 [msec]
[Timing] (Rank 6) Exchange : 104 [msec]
[Timing] (Rank 6) Min-Max : 19 [msec]
[Timing] (Rank 6) Elbow-Sort: 28 [msec]
[Timing] (Rank 55) Total : 193 [msec]
[Timing] (Rank 55) Full-Sort : 20 [msec]
[Timing] (Rank 55) Exchange : 102 [msec]
[Timing] (Rank 55) Min-Max : 19 [msec]
[Timing] (Rank 55) Elbow-Sort: 27 [msec]
[Timing] (Rank 9) Total : 199 [msec]
[Timing] (Rank 9) Full-Sort : 20 [msec]
[Timing] (Rank 9) Exchange : 103 [msec]
[Timing] (Rank 9) Min-Max : 22 [msec]
[Timing] (Rank 9) Elbow-Sort: 28 [msec]
[Timing] (Rank 52) Total : 193 [msec]
[Timing] (Rank 52) Full-Sort : 21 [msec]
[Timing] (Rank 52) Exchange : 100 [msec]
[Timing] (Rank 52) Min-Max : 20 [msec]
[Timing] (Rank 52) Elbow-Sort: 28 [msec]
[Timing] (Rank 15) Total : 199 [msec]
[Timing] (Rank 15) Full-Sort : 20 [msec]
[Timing] (Rank 15) Exchange : 114 [msec]
[Timing] (Rank 15) Min-Max : 15 [msec]
[Timing] (Rank 15) Elbow-Sort: 27 [msec]
[Timing] (Rank 62) Total : 193 [msec]
[Timing] (Rank 62) Full-Sort : 20 [msec]
[Timing] (Rank 62) Exchange : 103 [msec]
[Timing] (Rank 62) Min-Max : 22 [msec]
[Timing] (Rank 62) Elbow-Sort: 27 [msec]
[Timing] (Rank 12) Total : 199 [msec]
[Timing] (Rank 12) Full-Sort : 20 [msec]
[Timing] (Rank 12) Exchange : 101 [msec]
[Timing] (Rank 12) Min-Max : 22 [msec]
[Timing] (Rank 12) Elbow-Sort: 27 [msec]
[Timing] (Rank 51) Total : 193 [msec]
[Timing] (Rank 51) Full-Sort : 20 [msec]
[Timing] (Rank 51) Exchange : 87 [msec]
[Timing] (Rank 51) Min-Max : 28 [msec]
[Timing] (Rank 51) Elbow-Sort: 27 [msec]
[Timing] (Rank 50) Total : 193 [msec]
[Timing] (Rank 50) Full-Sort : 21 [msec]
[Timing] (Rank 50) Exchange : 95 [msec]
[Timing] (Rank 50) Min-Max : 23 [msec]
[Timing] (Rank 50) Elbow-Sort: 27 [msec]
[Timing] (Rank 49) Total : 194 [msec]
[Timing] (Rank 49) Full-Sort : 19 [msec]
[Timing] (Rank 49) Exchange : 97 [msec]
[Timing] (Rank 49) Min-Max : 24 [msec]
[Timing] (Rank 49) Elbow-Sort: 28 [msec]
[Timing] (Rank 56) Total : 193 [msec]
[Timing] (Rank 56) Full-Sort : 20 [msec]
[Timing] (Rank 56) Exchange : 98 [msec]
[Timing] (Rank 56) Min-Max : 23 [msec]
[Timing] (Rank 56) Elbow-Sort: 27 [msec]
[Timing] (Rank 59) Total : 194 [msec]
[Timing] (Rank 59) Full-Sort : 19 [msec]
[Timing] (Rank 59) Exchange : 108 [msec]
[Timing] (Rank 59) Min-Max : 17 [msec]
[Timing] (Rank 59) Elbow-Sort: 27 [msec]
[Timing] (Rank 61) Total : 193 [msec]
[Timing] (Rank 61) Full-Sort : 20 [msec]
[Timing] (Rank 61) Exchange : 105 [msec]
[Timing] (Rank 61) Min-Max : 20 [msec]
[Timing] (Rank 61) Elbow-Sort: 27 [msec]
[Timing] (Rank 48) Total : 194 [msec]
[Timing] (Rank 48) Full-Sort : 20 [msec]
[Timing] (Rank 48) Exchange : 105 [msec]
[Timing] (Rank 48) Min-Max : 19 [msec]
[Timing] (Rank 48) Elbow-Sort: 28 [msec]
@@ -0,0 +1,342 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 40) Total : 1419 [msec]
[Timing] (Rank 40) Full-Sort : 219 [msec]
[Timing] (Rank 40) Exchange : 651 [msec]
[Timing] (Rank 40) Min-Max : 165 [msec]
[Timing] (Rank 40) Elbow-Sort: 241 [msec]
[Timing] (Rank 30) Total : 1458 [msec]
[Timing] (Rank 30) Full-Sort : 201 [msec]
[Timing] (Rank 30) Exchange : 621 [msec]
[Timing] (Rank 30) Min-Max : 200 [msec]
[Timing] (Rank 30) Elbow-Sort: 236 [msec]
[Timing] (Rank 57) Total : 1428 [msec]
[Timing] (Rank 57) Full-Sort : 217 [msec]
[Timing] (Rank 57) Exchange : 488 [msec]
[Timing] (Rank 57) Min-Max : 254 [msec]
[Timing] (Rank 57) Elbow-Sort: 242 [msec]
[Timing] (Rank 2) Total : 1453 [msec]
[Timing] (Rank 2) Full-Sort : 197 [msec]
[Timing] (Rank 2) Exchange : 751 [msec]
[Timing] (Rank 2) Min-Max : 113 [msec]
[Timing] (Rank 2) Elbow-Sort: 235 [msec]
[Timing] (Rank 36) Total : 1443 [msec]
[Timing] (Rank 36) Full-Sort : 219 [msec]
[Timing] (Rank 36) Exchange : 557 [msec]
[Timing] (Rank 36) Min-Max : 241 [msec]
[Timing] (Rank 36) Elbow-Sort: 236 [msec]
[Timing] (Rank 42) Total : 1416 [msec]
[Timing] (Rank 42) Full-Sort : 219 [msec]
[Timing] (Rank 42) Exchange : 689 [msec]
[Timing] (Rank 42) Min-Max : 145 [msec]
[Timing] (Rank 42) Elbow-Sort: 240 [msec]
[Timing] (Rank 32) Total : 1448 [msec]
[Timing] (Rank 32) Full-Sort : 219 [msec]
[Timing] (Rank 32) Exchange : 710 [msec]
[Timing] (Rank 32) Min-Max : 154 [msec]
[Timing] (Rank 32) Elbow-Sort: 244 [msec]
[Timing] (Rank 43) Total : 1417 [msec]
[Timing] (Rank 43) Full-Sort : 212 [msec]
[Timing] (Rank 43) Exchange : 667 [msec]
[Timing] (Rank 43) Min-Max : 155 [msec]
[Timing] (Rank 43) Elbow-Sort: 242 [msec]
[Timing] (Rank 45) Total : 1444 [msec]
[Timing] (Rank 45) Full-Sort : 212 [msec]
[Timing] (Rank 45) Exchange : 536 [msec]
[Timing] (Rank 45) Min-Max : 258 [msec]
[Timing] (Rank 45) Elbow-Sort: 238 [msec]
[Timing] (Rank 39) Total : 1443 [msec]
[Timing] (Rank 39) Full-Sort : 215 [msec]
[Timing] (Rank 39) Exchange : 516 [msec]
[Timing] (Rank 39) Min-Max : 268 [msec]
[Timing] (Rank 39) Elbow-Sort: 233 [msec]
[Timing] (Rank 44) Total : 1443 [msec]
[Timing] (Rank 44) Full-Sort : 217 [msec]
[Timing] (Rank 44) Exchange : 512 [msec]
[Timing] (Rank 44) Min-Max : 267 [msec]
[Timing] (Rank 44) Elbow-Sort: 236 [msec]
[Timing] (Rank 46) Total : 1444 [msec]
[Timing] (Rank 46) Full-Sort : 218 [msec]
[Timing] (Rank 46) Exchange : 523 [msec]
[Timing] (Rank 46) Min-Max : 264 [msec]
[Timing] (Rank 46) Elbow-Sort: 235 [msec]
[Timing] (Rank 41) Total : 1419 [msec]
[Timing] (Rank 41) Full-Sort : 218 [msec]
[Timing] (Rank 41) Exchange : 569 [msec]
[Timing] (Rank 41) Min-Max : 206 [msec]
[Timing] (Rank 41) Elbow-Sort: 240 [msec]
[Timing] (Rank 35) Total : 1447 [msec]
[Timing] (Rank 35) Full-Sort : 217 [msec]
[Timing] (Rank 35) Exchange : 549 [msec]
[Timing] (Rank 35) Min-Max : 238 [msec]
[Timing] (Rank 35) Elbow-Sort: 242 [msec]
[Timing] (Rank 38) Total : 1444 [msec]
[Timing] (Rank 38) Full-Sort : 219 [msec]
[Timing] (Rank 38) Exchange : 469 [msec]
[Timing] (Rank 38) Min-Max : 293 [msec]
[Timing] (Rank 38) Elbow-Sort: 234 [msec]
[Timing] (Rank 33) Total : 1446 [msec]
[Timing] (Rank 33) Full-Sort : 207 [msec]
[Timing] (Rank 33) Exchange : 618 [msec]
[Timing] (Rank 33) Min-Max : 200 [msec]
[Timing] (Rank 33) Elbow-Sort: 242 [msec]
[Timing] (Rank 47) Total : 1445 [msec]
[Timing] (Rank 47) Full-Sort : 207 [msec]
[Timing] (Rank 47) Exchange : 613 [msec]
[Timing] (Rank 47) Min-Max : 214 [msec]
[Timing] (Rank 47) Elbow-Sort: 236 [msec]
[Timing] (Rank 34) Total : 1447 [msec]
[Timing] (Rank 34) Full-Sort : 217 [msec]
[Timing] (Rank 34) Exchange : 610 [msec]
[Timing] (Rank 34) Min-Max : 203 [msec]
[Timing] (Rank 34) Elbow-Sort: 241 [msec]
[Timing] (Rank 37) Total : 1443 [msec]
[Timing] (Rank 37) Full-Sort : 211 [msec]
[Timing] (Rank 37) Exchange : 571 [msec]
[Timing] (Rank 37) Min-Max : 228 [msec]
[Timing] (Rank 37) Elbow-Sort: 238 [msec]
[Timing] (Rank 31) Total : 1458 [msec]
[Timing] (Rank 31) Full-Sort : 192 [msec]
[Timing] (Rank 31) Exchange : 749 [msec]
[Timing] (Rank 31) Min-Max : 144 [msec]
[Timing] (Rank 31) Elbow-Sort: 237 [msec]
[Timing] (Rank 21) Total : 1447 [msec]
[Timing] (Rank 21) Full-Sort : 182 [msec]
[Timing] (Rank 21) Exchange : 709 [msec]
[Timing] (Rank 21) Min-Max : 150 [msec]
[Timing] (Rank 21) Elbow-Sort: 244 [msec]
[Timing] (Rank 20) Total : 1445 [msec]
[Timing] (Rank 20) Full-Sort : 197 [msec]
[Timing] (Rank 20) Exchange : 703 [msec]
[Timing] (Rank 20) Min-Max : 145 [msec]
[Timing] (Rank 20) Elbow-Sort: 243 [msec]
[Timing] (Rank 17) Total : 1450 [msec]
[Timing] (Rank 17) Full-Sort : 188 [msec]
[Timing] (Rank 17) Exchange : 607 [msec]
[Timing] (Rank 17) Min-Max : 203 [msec]
[Timing] (Rank 17) Elbow-Sort: 245 [msec]
[Timing] (Rank 19) Total : 1445 [msec]
[Timing] (Rank 19) Full-Sort : 190 [msec]
[Timing] (Rank 19) Exchange : 562 [msec]
[Timing] (Rank 19) Min-Max : 215 [msec]
[Timing] (Rank 19) Elbow-Sort: 250 [msec]
[Timing] (Rank 23) Total : 1438 [msec]
[Timing] (Rank 23) Full-Sort : 188 [msec]
[Timing] (Rank 23) Exchange : 650 [msec]
[Timing] (Rank 23) Min-Max : 173 [msec]
[Timing] (Rank 23) Elbow-Sort: 245 [msec]
[Timing] (Rank 28) Total : 1453 [msec]
[Timing] (Rank 28) Full-Sort : 201 [msec]
[Timing] (Rank 28) Exchange : 572 [msec]
[Timing] (Rank 28) Min-Max : 219 [msec]
[Timing] (Rank 28) Elbow-Sort: 239 [msec]
[Timing] (Rank 18) Total : 1444 [msec]
[Timing] (Rank 18) Full-Sort : 197 [msec]
[Timing] (Rank 18) Exchange : 589 [msec]
[Timing] (Rank 18) Min-Max : 192 [msec]
[Timing] (Rank 18) Elbow-Sort: 244 [msec]
[Timing] (Rank 22) Total : 1439 [msec]
[Timing] (Rank 22) Full-Sort : 197 [msec]
[Timing] (Rank 22) Exchange : 637 [msec]
[Timing] (Rank 22) Min-Max : 176 [msec]
[Timing] (Rank 22) Elbow-Sort: 240 [msec]
[Timing] (Rank 26) Total : 1425 [msec]
[Timing] (Rank 26) Full-Sort : 201 [msec]
[Timing] (Rank 26) Exchange : 593 [msec]
[Timing] (Rank 26) Min-Max : 190 [msec]
[Timing] (Rank 26) Elbow-Sort: 241 [msec]
[Timing] (Rank 24) Total : 1431 [msec]
[Timing] (Rank 24) Full-Sort : 201 [msec]
[Timing] (Rank 24) Exchange : 573 [msec]
[Timing] (Rank 24) Min-Max : 203 [msec]
[Timing] (Rank 24) Elbow-Sort: 245 [msec]
[Timing] (Rank 27) Total : 1424 [msec]
[Timing] (Rank 27) Full-Sort : 192 [msec]
[Timing] (Rank 27) Exchange : 588 [msec]
[Timing] (Rank 27) Min-Max : 194 [msec]
[Timing] (Rank 27) Elbow-Sort: 244 [msec]
[Timing] (Rank 25) Total : 1427 [msec]
[Timing] (Rank 25) Full-Sort : 191 [msec]
[Timing] (Rank 25) Exchange : 505 [msec]
[Timing] (Rank 25) Min-Max : 239 [msec]
[Timing] (Rank 25) Elbow-Sort: 241 [msec]
[Timing] (Rank 29) Total : 1454 [msec]
[Timing] (Rank 29) Full-Sort : 192 [msec]
[Timing] (Rank 29) Exchange : 658 [msec]
[Timing] (Rank 29) Min-Max : 184 [msec]
[Timing] (Rank 29) Elbow-Sort: 240 [msec]
[Timing] (Rank 16) Total : 1450 [msec]
[Timing] (Rank 16) Full-Sort : 196 [msec]
[Timing] (Rank 16) Exchange : 693 [msec]
[Timing] (Rank 16) Min-Max : 156 [msec]
[Timing] (Rank 16) Elbow-Sort: 245 [msec]
[Timing] (Rank 56) Total : 1427 [msec]
[Timing] (Rank 56) Full-Sort : 218 [msec]
[Timing] (Rank 56) Exchange : 539 [msec]
[Timing] (Rank 56) Min-Max : 222 [msec]
[Timing] (Rank 56) Elbow-Sort: 242 [msec]
[Timing] (Rank 54) Total : 1439 [msec]
[Timing] (Rank 54) Full-Sort : 219 [msec]
[Timing] (Rank 54) Exchange : 529 [msec]
[Timing] (Rank 54) Min-Max : 253 [msec]
[Timing] (Rank 54) Elbow-Sort: 232 [msec]
[Timing] (Rank 63) Total : 1446 [msec]
[Timing] (Rank 63) Full-Sort : 207 [msec]
[Timing] (Rank 63) Exchange : 704 [msec]
[Timing] (Rank 63) Min-Max : 158 [msec]
[Timing] (Rank 63) Elbow-Sort: 242 [msec]
[Timing] (Rank 60) Total : 1445 [msec]
[Timing] (Rank 60) Full-Sort : 216 [msec]
[Timing] (Rank 60) Exchange : 523 [msec]
[Timing] (Rank 60) Min-Max : 250 [msec]
[Timing] (Rank 60) Elbow-Sort: 242 [msec]
[Timing] (Rank 53) Total : 1434 [msec]
[Timing] (Rank 53) Full-Sort : 217 [msec]
[Timing] (Rank 53) Exchange : 610 [msec]
[Timing] (Rank 53) Min-Max : 203 [msec]
[Timing] (Rank 53) Elbow-Sort: 238 [msec]
[Timing] (Rank 48) Total : 1436 [msec]
[Timing] (Rank 48) Full-Sort : 210 [msec]
[Timing] (Rank 48) Exchange : 623 [msec]
[Timing] (Rank 48) Min-Max : 197 [msec]
[Timing] (Rank 48) Elbow-Sort: 238 [msec]
[Timing] (Rank 55) Total : 1438 [msec]
[Timing] (Rank 55) Full-Sort : 216 [msec]
[Timing] (Rank 55) Exchange : 540 [msec]
[Timing] (Rank 55) Min-Max : 247 [msec]
[Timing] (Rank 55) Elbow-Sort: 234 [msec]
[Timing] (Rank 52) Total : 1434 [msec]
[Timing] (Rank 52) Full-Sort : 218 [msec]
[Timing] (Rank 52) Exchange : 570 [msec]
[Timing] (Rank 52) Min-Max : 223 [msec]
[Timing] (Rank 52) Elbow-Sort: 235 [msec]
[Timing] (Rank 49) Total : 1435 [msec]
[Timing] (Rank 49) Full-Sort : 212 [msec]
[Timing] (Rank 49) Exchange : 512 [msec]
[Timing] (Rank 49) Min-Max : 248 [msec]
[Timing] (Rank 49) Elbow-Sort: 240 [msec]
[Timing] (Rank 51) Total : 1427 [msec]
[Timing] (Rank 51) Full-Sort : 213 [msec]
[Timing] (Rank 51) Exchange : 439 [msec]
[Timing] (Rank 51) Min-Max : 289 [msec]
[Timing] (Rank 51) Elbow-Sort: 237 [msec]
[Timing] (Rank 59) Total : 1418 [msec]
[Timing] (Rank 59) Full-Sort : 212 [msec]
[Timing] (Rank 59) Exchange : 570 [msec]
[Timing] (Rank 59) Min-Max : 211 [msec]
[Timing] (Rank 59) Elbow-Sort: 240 [msec]
[Timing] (Rank 61) Total : 1446 [msec]
[Timing] (Rank 61) Full-Sort : 209 [msec]
[Timing] (Rank 61) Exchange : 616 [msec]
[Timing] (Rank 61) Min-Max : 211 [msec]
[Timing] (Rank 61) Elbow-Sort: 242 [msec]
[Timing] (Rank 50) Total : 1427 [msec]
[Timing] (Rank 50) Full-Sort : 216 [msec]
[Timing] (Rank 50) Exchange : 504 [msec]
[Timing] (Rank 50) Min-Max : 254 [msec]
[Timing] (Rank 50) Elbow-Sort: 237 [msec]
[Timing] (Rank 58) Total : 1420 [msec]
[Timing] (Rank 58) Full-Sort : 219 [msec]
[Timing] (Rank 58) Exchange : 604 [msec]
[Timing] (Rank 58) Min-Max : 194 [msec]
[Timing] (Rank 58) Elbow-Sort: 239 [msec]
[Timing] (Rank 62) Total : 1447 [msec]
[Timing] (Rank 62) Full-Sort : 216 [msec]
[Timing] (Rank 62) Exchange : 604 [msec]
[Timing] (Rank 62) Min-Max : 209 [msec]
[Timing] (Rank 62) Elbow-Sort: 241 [msec]
[Timing] (Rank 5) Total : 1447 [msec]
[Timing] (Rank 5) Full-Sort : 191 [msec]
[Timing] (Rank 5) Exchange : 747 [msec]
[Timing] (Rank 5) Min-Max : 117 [msec]
[Timing] (Rank 5) Elbow-Sort: 234 [msec]
[Timing] (Rank 6) Total : 1447 [msec]
[Timing] (Rank 6) Full-Sort : 200 [msec]
[Timing] (Rank 6) Exchange : 633 [msec]
[Timing] (Rank 6) Min-Max : 171 [msec]
[Timing] (Rank 6) Elbow-Sort: 232 [msec]
[Timing] (Rank 1) Total : 1452 [msec]
[Timing] (Rank 1) Full-Sort : 193 [msec]
[Timing] (Rank 1) Exchange : 755 [msec]
[Timing] (Rank 1) Min-Max : 109 [msec]
[Timing] (Rank 1) Elbow-Sort: 239 [msec]
[Timing] (Rank 8) Total : 1434 [msec]
[Timing] (Rank 8) Full-Sort : 197 [msec]
[Timing] (Rank 8) Exchange : 713 [msec]
[Timing] (Rank 8) Min-Max : 131 [msec]
[Timing] (Rank 8) Elbow-Sort: 235 [msec]
[Timing] (Rank 3) Total : 1452 [msec]
[Timing] (Rank 3) Full-Sort : 191 [msec]
[Timing] (Rank 3) Exchange : 681 [msec]
[Timing] (Rank 3) Min-Max : 153 [msec]
[Timing] (Rank 3) Elbow-Sort: 237 [msec]
[Timing] (Rank 4) Total : 1446 [msec]
[Timing] (Rank 4) Full-Sort : 201 [msec]
[Timing] (Rank 4) Exchange : 713 [msec]
[Timing] (Rank 4) Min-Max : 135 [msec]
[Timing] (Rank 4) Elbow-Sort: 236 [msec]
[Timing] (Rank 0) Total : 1452 [msec]
[Timing] (Rank 0) Full-Sort : 205 [msec]
[Timing] (Rank 0) Exchange : 840 [msec]
[Timing] (Rank 0) Min-Max : 77 [msec]
[Timing] (Rank 0) Elbow-Sort: 237 [msec]
Results validation ... [PASS] 
[Timing] (Rank 12) Total : 1446 [msec]
[Timing] (Rank 12) Full-Sort : 201 [msec]
[Timing] (Rank 12) Exchange : 600 [msec]
[Timing] (Rank 12) Min-Max : 186 [msec]
[Timing] (Rank 12) Elbow-Sort: 235 [msec]
[Timing] (Rank 15) Total : 1447 [msec]
[Timing] (Rank 15) Full-Sort : 194 [msec]
[Timing] (Rank 15) Exchange : 706 [msec]
[Timing] (Rank 15) Min-Max : 138 [msec]
[Timing] (Rank 15) Elbow-Sort: 233 [msec]
[Timing] (Rank 11) Total : 1429 [msec]
[Timing] (Rank 11) Full-Sort : 191 [msec]
[Timing] (Rank 11) Exchange : 689 [msec]
[Timing] (Rank 11) Min-Max : 132 [msec]
[Timing] (Rank 11) Elbow-Sort: 235 [msec]
[Timing] (Rank 14) Total : 1445 [msec]
[Timing] (Rank 14) Full-Sort : 201 [msec]
[Timing] (Rank 14) Exchange : 630 [msec]
[Timing] (Rank 14) Min-Max : 173 [msec]
[Timing] (Rank 14) Elbow-Sort: 229 [msec]
[Timing] (Rank 9) Total : 1433 [msec]
[Timing] (Rank 9) Full-Sort : 194 [msec]
[Timing] (Rank 9) Exchange : 640 [msec]
[Timing] (Rank 9) Min-Max : 158 [msec]
[Timing] (Rank 9) Elbow-Sort: 234 [msec]
[Timing] (Rank 13) Total : 1445 [msec]
[Timing] (Rank 13) Full-Sort : 192 [msec]
[Timing] (Rank 13) Exchange : 644 [msec]
[Timing] (Rank 13) Min-Max : 167 [msec]
[Timing] (Rank 13) Elbow-Sort: 232 [msec]
[Timing] (Rank 10) Total : 1429 [msec]
[Timing] (Rank 10) Full-Sort : 200 [msec]
[Timing] (Rank 10) Exchange : 709 [msec]
[Timing] (Rank 10) Min-Max : 120 [msec]
[Timing] (Rank 10) Elbow-Sort: 235 [msec]
[Timing] (Rank 7) Total : 1446 [msec]
[Timing] (Rank 7) Full-Sort : 191 [msec]
[Timing] (Rank 7) Exchange : 685 [msec]
[Timing] (Rank 7) Min-Max : 152 [msec]
[Timing] (Rank 7) Elbow-Sort: 233 [msec]
@@ -0,0 +1,342 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 39) Total : 5990 [msec]
[Timing] (Rank 39) Full-Sort : 942 [msec]
[Timing] (Rank 39) Exchange : 2276 [msec]
[Timing] (Rank 39) Min-Max : 1014 [msec]
[Timing] (Rank 39) Elbow-Sort: 959 [msec]
[Timing] (Rank 11) Total : 5891 [msec]
[Timing] (Rank 11) Full-Sort : 841 [msec]
[Timing] (Rank 11) Exchange : 2899 [msec]
[Timing] (Rank 11) Min-Max : 550 [msec]
[Timing] (Rank 11) Elbow-Sort: 943 [msec]
[Timing] (Rank 49) Total : 5988 [msec]
[Timing] (Rank 49) Full-Sort : 906 [msec]
[Timing] (Rank 49) Exchange : 2006 [msec]
[Timing] (Rank 49) Min-Max : 1144 [msec]
[Timing] (Rank 49) Elbow-Sort: 972 [msec]
[Timing] (Rank 25) Total : 5936 [msec]
[Timing] (Rank 25) Full-Sort : 859 [msec]
[Timing] (Rank 25) Exchange : 2143 [msec]
[Timing] (Rank 25) Min-Max : 969 [msec]
[Timing] (Rank 25) Elbow-Sort: 980 [msec]
[Timing] (Rank 40) Total : 5925 [msec]
[Timing] (Rank 40) Full-Sort : 961 [msec]
[Timing] (Rank 40) Exchange : 2522 [msec]
[Timing] (Rank 40) Min-Max : 862 [msec]
[Timing] (Rank 40) Elbow-Sort: 979 [msec]
[Timing] (Rank 41) Total : 5924 [msec]
[Timing] (Rank 41) Full-Sort : 942 [msec]
[Timing] (Rank 41) Exchange : 2319 [msec]
[Timing] (Rank 41) Min-Max : 942 [msec]
[Timing] (Rank 41) Elbow-Sort: 965 [msec]
[Timing] (Rank 32) Total : 6021 [msec]
[Timing] (Rank 32) Full-Sort : 871 [msec]
[Timing] (Rank 32) Exchange : 2811 [msec]
[Timing] (Rank 32) Min-Max : 681 [msec]
[Timing] (Rank 32) Elbow-Sort: 1041 [msec]
[Timing] (Rank 36) Total : 5994 [msec]
[Timing] (Rank 36) Full-Sort : 961 [msec]
[Timing] (Rank 36) Exchange : 2346 [msec]
[Timing] (Rank 36) Min-Max : 962 [msec]
[Timing] (Rank 36) Elbow-Sort: 974 [msec]
[Timing] (Rank 35) Total : 5996 [msec]
[Timing] (Rank 35) Full-Sort : 917 [msec]
[Timing] (Rank 35) Exchange : 2097 [msec]
[Timing] (Rank 35) Min-Max : 1077 [msec]
[Timing] (Rank 35) Elbow-Sort: 975 [msec]
[Timing] (Rank 34) Total : 5995 [msec]
[Timing] (Rank 34) Full-Sort : 944 [msec]
[Timing] (Rank 34) Exchange : 2408 [msec]
[Timing] (Rank 34) Min-Max : 892 [msec]
[Timing] (Rank 34) Elbow-Sort: 969 [msec]
[Timing] (Rank 38) Total : 5986 [msec]
[Timing] (Rank 38) Full-Sort : 958 [msec]
[Timing] (Rank 38) Exchange : 1996 [msec]
[Timing] (Rank 38) Min-Max : 1169 [msec]
[Timing] (Rank 38) Elbow-Sort: 952 [msec]
[Timing] (Rank 44) Total : 5923 [msec]
[Timing] (Rank 44) Full-Sort : 942 [msec]
[Timing] (Rank 44) Exchange : 2064 [msec]
[Timing] (Rank 44) Min-Max : 1109 [msec]
[Timing] (Rank 44) Elbow-Sort: 969 [msec]
[Timing] (Rank 43) Total : 5932 [msec]
[Timing] (Rank 43) Full-Sort : 947 [msec]
[Timing] (Rank 43) Exchange : 2462 [msec]
[Timing] (Rank 43) Min-Max : 839 [msec]
[Timing] (Rank 43) Elbow-Sort: 979 [msec]
[Timing] (Rank 42) Total : 5931 [msec]
[Timing] (Rank 42) Full-Sort : 967 [msec]
[Timing] (Rank 42) Exchange : 2643 [msec]
[Timing] (Rank 42) Min-Max : 775 [msec]
[Timing] (Rank 42) Elbow-Sort: 960 [msec]
[Timing] (Rank 46) Total : 5941 [msec]
[Timing] (Rank 46) Full-Sort : 946 [msec]
[Timing] (Rank 46) Exchange : 2205 [msec]
[Timing] (Rank 46) Min-Max : 1030 [msec]
[Timing] (Rank 46) Elbow-Sort: 969 [msec]
[Timing] (Rank 45) Total : 5932 [msec]
[Timing] (Rank 45) Full-Sort : 893 [msec]
[Timing] (Rank 45) Exchange : 2293 [msec]
[Timing] (Rank 45) Min-Max : 994 [msec]
[Timing] (Rank 45) Elbow-Sort: 985 [msec]
[Timing] (Rank 37) Total : 5987 [msec]
[Timing] (Rank 37) Full-Sort : 943 [msec]
[Timing] (Rank 37) Exchange : 2319 [msec]
[Timing] (Rank 37) Min-Max : 972 [msec]
[Timing] (Rank 37) Elbow-Sort: 963 [msec]
[Timing] (Rank 33) Total : 5995 [msec]
[Timing] (Rank 33) Full-Sort : 903 [msec]
[Timing] (Rank 33) Exchange : 2398 [msec]
[Timing] (Rank 33) Min-Max : 893 [msec]
[Timing] (Rank 33) Elbow-Sort: 1006 [msec]
[Timing] (Rank 47) Total : 5941 [msec]
[Timing] (Rank 47) Full-Sort : 916 [msec]
[Timing] (Rank 47) Exchange : 2586 [msec]
[Timing] (Rank 47) Min-Max : 801 [msec]
[Timing] (Rank 47) Elbow-Sort: 976 [msec]
[Timing] (Rank 15) Total : 5942 [msec]
[Timing] (Rank 15) Full-Sort : 857 [msec]
[Timing] (Rank 15) Exchange : 2824 [msec]
[Timing] (Rank 15) Min-Max : 609 [msec]
[Timing] (Rank 15) Elbow-Sort: 936 [msec]
[Timing] (Rank 4) Total : 5895 [msec]
[Timing] (Rank 4) Full-Sort : 881 [msec]
[Timing] (Rank 4) Exchange : 2885 [msec]
[Timing] (Rank 4) Min-Max : 565 [msec]
[Timing] (Rank 4) Elbow-Sort: 934 [msec]
[Timing] (Rank 3) Total : 5935 [msec]
[Timing] (Rank 3) Full-Sort : 850 [msec]
[Timing] (Rank 3) Exchange : 2796 [msec]
[Timing] (Rank 3) Min-Max : 621 [msec]
[Timing] (Rank 3) Elbow-Sort: 946 [msec]
[Timing] (Rank 0) Total : 5962 [msec]
[Timing] (Rank 0) Full-Sort : 898 [msec]
[Timing] (Rank 0) Exchange : 3540 [msec]
[Timing] (Rank 0) Min-Max : 239 [msec]
[Timing] (Rank 0) Elbow-Sort: 985 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 5935 [msec]
[Timing] (Rank 2) Full-Sort : 884 [msec]
[Timing] (Rank 2) Exchange : 3175 [msec]
[Timing] (Rank 2) Min-Max : 413 [msec]
[Timing] (Rank 2) Elbow-Sort: 956 [msec]
[Timing] (Rank 1) Total : 5946 [msec]
[Timing] (Rank 1) Full-Sort : 845 [msec]
[Timing] (Rank 1) Exchange : 3071 [msec]
[Timing] (Rank 1) Min-Max : 452 [msec]
[Timing] (Rank 1) Elbow-Sort: 967 [msec]
[Timing] (Rank 7) Total : 5922 [msec]
[Timing] (Rank 7) Full-Sort : 846 [msec]
[Timing] (Rank 7) Exchange : 2653 [msec]
[Timing] (Rank 7) Min-Max : 707 [msec]
[Timing] (Rank 7) Elbow-Sort: 934 [msec]
[Timing] (Rank 5) Total : 5898 [msec]
[Timing] (Rank 5) Full-Sort : 850 [msec]
[Timing] (Rank 5) Exchange : 2817 [msec]
[Timing] (Rank 5) Min-Max : 563 [msec]
[Timing] (Rank 5) Elbow-Sort: 949 [msec]
[Timing] (Rank 10) Total : 5886 [msec]
[Timing] (Rank 10) Full-Sort : 885 [msec]
[Timing] (Rank 10) Exchange : 2907 [msec]
[Timing] (Rank 10) Min-Max : 510 [msec]
[Timing] (Rank 10) Elbow-Sort: 939 [msec]
[Timing] (Rank 13) Total : 5943 [msec]
[Timing] (Rank 13) Full-Sort : 842 [msec]
[Timing] (Rank 13) Exchange : 2558 [msec]
[Timing] (Rank 13) Min-Max : 718 [msec]
[Timing] (Rank 13) Elbow-Sort: 950 [msec]
[Timing] (Rank 14) Total : 5940 [msec]
[Timing] (Rank 14) Full-Sort : 882 [msec]
[Timing] (Rank 14) Exchange : 2581 [msec]
[Timing] (Rank 14) Min-Max : 719 [msec]
[Timing] (Rank 14) Elbow-Sort: 930 [msec]
[Timing] (Rank 12) Total : 5944 [msec]
[Timing] (Rank 12) Full-Sort : 889 [msec]
[Timing] (Rank 12) Exchange : 2480 [msec]
[Timing] (Rank 12) Min-Max : 752 [msec]
[Timing] (Rank 12) Elbow-Sort: 941 [msec]
[Timing] (Rank 8) Total : 5906 [msec]
[Timing] (Rank 8) Full-Sort : 878 [msec]
[Timing] (Rank 8) Exchange : 2922 [msec]
[Timing] (Rank 8) Min-Max : 560 [msec]
[Timing] (Rank 8) Elbow-Sort: 933 [msec]
[Timing] (Rank 9) Total : 5910 [msec]
[Timing] (Rank 9) Full-Sort : 851 [msec]
[Timing] (Rank 9) Exchange : 2632 [msec]
[Timing] (Rank 9) Min-Max : 671 [msec]
[Timing] (Rank 9) Elbow-Sort: 940 [msec]
[Timing] (Rank 6) Total : 5920 [msec]
[Timing] (Rank 6) Full-Sort : 891 [msec]
[Timing] (Rank 6) Exchange : 2561 [msec]
[Timing] (Rank 6) Min-Max : 715 [msec]
[Timing] (Rank 6) Elbow-Sort: 935 [msec]
[Timing] (Rank 24) Total : 5928 [msec]
[Timing] (Rank 24) Full-Sort : 885 [msec]
[Timing] (Rank 24) Exchange : 2447 [msec]
[Timing] (Rank 24) Min-Max : 799 [msec]
[Timing] (Rank 24) Elbow-Sort: 983 [msec]
[Timing] (Rank 29) Total : 5880 [msec]
[Timing] (Rank 29) Full-Sort : 854 [msec]
[Timing] (Rank 29) Exchange : 2631 [msec]
[Timing] (Rank 29) Min-Max : 721 [msec]
[Timing] (Rank 29) Elbow-Sort: 980 [msec]
[Timing] (Rank 17) Total : 6038 [msec]
[Timing] (Rank 17) Full-Sort : 841 [msec]
[Timing] (Rank 17) Exchange : 2351 [msec]
[Timing] (Rank 17) Min-Max : 950 [msec]
[Timing] (Rank 17) Elbow-Sort: 992 [msec]
[Timing] (Rank 23) Total : 5988 [msec]
[Timing] (Rank 23) Full-Sort : 849 [msec]
[Timing] (Rank 23) Exchange : 2672 [msec]
[Timing] (Rank 23) Min-Max : 780 [msec]
[Timing] (Rank 23) Elbow-Sort: 977 [msec]
[Timing] (Rank 22) Total : 5996 [msec]
[Timing] (Rank 22) Full-Sort : 850 [msec]
[Timing] (Rank 22) Exchange : 2731 [msec]
[Timing] (Rank 22) Min-Max : 699 [msec]
[Timing] (Rank 22) Elbow-Sort: 980 [msec]
[Timing] (Rank 52) Total : 5898 [msec]
[Timing] (Rank 52) Full-Sort : 970 [msec]
[Timing] (Rank 52) Exchange : 2482 [msec]
[Timing] (Rank 52) Min-Max : 790 [msec]
[Timing] (Rank 52) Elbow-Sort: 987 [msec]
[Timing] (Rank 62) Total : 5970 [msec]
[Timing] (Rank 62) Full-Sort : 958 [msec]
[Timing] (Rank 62) Exchange : 2386 [msec]
[Timing] (Rank 62) Min-Max : 943 [msec]
[Timing] (Rank 62) Elbow-Sort: 970 [msec]
[Timing] (Rank 53) Total : 5901 [msec]
[Timing] (Rank 53) Full-Sort : 924 [msec]
[Timing] (Rank 53) Exchange : 2579 [msec]
[Timing] (Rank 53) Min-Max : 759 [msec]
[Timing] (Rank 53) Elbow-Sort: 991 [msec]
[Timing] (Rank 61) Total : 5947 [msec]
[Timing] (Rank 61) Full-Sort : 908 [msec]
[Timing] (Rank 61) Exchange : 2487 [msec]
[Timing] (Rank 61) Min-Max : 915 [msec]
[Timing] (Rank 61) Elbow-Sort: 969 [msec]
[Timing] (Rank 54) Total : 5909 [msec]
[Timing] (Rank 54) Full-Sort : 966 [msec]
[Timing] (Rank 54) Exchange : 2132 [msec]
[Timing] (Rank 54) Min-Max : 1015 [msec]
[Timing] (Rank 54) Elbow-Sort: 977 [msec]
[Timing] (Rank 60) Total : 5940 [msec]
[Timing] (Rank 60) Full-Sort : 955 [msec]
[Timing] (Rank 60) Exchange : 2266 [msec]
[Timing] (Rank 60) Min-Max : 1009 [msec]
[Timing] (Rank 60) Elbow-Sort: 956 [msec]
[Timing] (Rank 19) Total : 6022 [msec]
[Timing] (Rank 19) Full-Sort : 822 [msec]
[Timing] (Rank 19) Exchange : 2358 [msec]
[Timing] (Rank 19) Min-Max : 959 [msec]
[Timing] (Rank 19) Elbow-Sort: 992 [msec]
[Timing] (Rank 58) Total : 5970 [msec]
[Timing] (Rank 58) Full-Sort : 969 [msec]
[Timing] (Rank 58) Exchange : 2391 [msec]
[Timing] (Rank 58) Min-Max : 975 [msec]
[Timing] (Rank 58) Elbow-Sort: 943 [msec]
[Timing] (Rank 28) Total : 5860 [msec]
[Timing] (Rank 28) Full-Sort : 899 [msec]
[Timing] (Rank 28) Exchange : 2280 [msec]
[Timing] (Rank 28) Min-Max : 864 [msec]
[Timing] (Rank 28) Elbow-Sort: 967 [msec]
[Timing] (Rank 16) Total : 6041 [msec]
[Timing] (Rank 16) Full-Sort : 857 [msec]
[Timing] (Rank 16) Exchange : 3009 [msec]
[Timing] (Rank 16) Min-Max : 599 [msec]
[Timing] (Rank 16) Elbow-Sort: 986 [msec]
[Timing] (Rank 20) Total : 6011 [msec]
[Timing] (Rank 20) Full-Sort : 849 [msec]
[Timing] (Rank 20) Exchange : 2995 [msec]
[Timing] (Rank 20) Min-Max : 591 [msec]
[Timing] (Rank 20) Elbow-Sort: 967 [msec]
[Timing] (Rank 56) Total : 5980 [msec]
[Timing] (Rank 56) Full-Sort : 966 [msec]
[Timing] (Rank 56) Exchange : 2250 [msec]
[Timing] (Rank 56) Min-Max : 980 [msec]
[Timing] (Rank 56) Elbow-Sort: 967 [msec]
[Timing] (Rank 51) Total : 5983 [msec]
[Timing] (Rank 51) Full-Sort : 919 [msec]
[Timing] (Rank 51) Exchange : 1918 [msec]
[Timing] (Rank 51) Min-Max : 1205 [msec]
[Timing] (Rank 51) Elbow-Sort: 958 [msec]
[Timing] (Rank 18) Total : 6016 [msec]
[Timing] (Rank 18) Full-Sort : 868 [msec]
[Timing] (Rank 18) Exchange : 2602 [msec]
[Timing] (Rank 18) Min-Max : 771 [msec]
[Timing] (Rank 18) Elbow-Sort: 968 [msec]
[Timing] (Rank 27) Total : 5921 [msec]
[Timing] (Rank 27) Full-Sort : 848 [msec]
[Timing] (Rank 27) Exchange : 2482 [msec]
[Timing] (Rank 27) Min-Max : 824 [msec]
[Timing] (Rank 27) Elbow-Sort: 973 [msec]
[Timing] (Rank 57) Total : 5987 [msec]
[Timing] (Rank 57) Full-Sort : 942 [msec]
[Timing] (Rank 57) Exchange : 2070 [msec]
[Timing] (Rank 57) Min-Max : 1089 [msec]
[Timing] (Rank 57) Elbow-Sort: 973 [msec]
[Timing] (Rank 31) Total : 5907 [msec]
[Timing] (Rank 31) Full-Sort : 852 [msec]
[Timing] (Rank 31) Exchange : 2989 [msec]
[Timing] (Rank 31) Min-Max : 530 [msec]
[Timing] (Rank 31) Elbow-Sort: 979 [msec]
[Timing] (Rank 30) Total : 5889 [msec]
[Timing] (Rank 30) Full-Sort : 884 [msec]
[Timing] (Rank 30) Exchange : 2610 [msec]
[Timing] (Rank 30) Min-Max : 712 [msec]
[Timing] (Rank 30) Elbow-Sort: 971 [msec]
[Timing] (Rank 55) Total : 5914 [msec]
[Timing] (Rank 55) Full-Sort : 958 [msec]
[Timing] (Rank 55) Exchange : 2463 [msec]
[Timing] (Rank 55) Min-Max : 825 [msec]
[Timing] (Rank 55) Elbow-Sort: 983 [msec]
[Timing] (Rank 21) Total : 6007 [msec]
[Timing] (Rank 21) Full-Sort : 835 [msec]
[Timing] (Rank 21) Exchange : 2720 [msec]
[Timing] (Rank 21) Min-Max : 743 [msec]
[Timing] (Rank 21) Elbow-Sort: 994 [msec]
[Timing] (Rank 26) Total : 5907 [msec]
[Timing] (Rank 26) Full-Sort : 886 [msec]
[Timing] (Rank 26) Exchange : 2577 [msec]
[Timing] (Rank 26) Min-Max : 745 [msec]
[Timing] (Rank 26) Elbow-Sort: 967 [msec]
[Timing] (Rank 59) Total : 5963 [msec]
[Timing] (Rank 59) Full-Sort : 958 [msec]
[Timing] (Rank 59) Exchange : 2442 [msec]
[Timing] (Rank 59) Min-Max : 912 [msec]
[Timing] (Rank 59) Elbow-Sort: 945 [msec]
[Timing] (Rank 50) Total : 5990 [msec]
[Timing] (Rank 50) Full-Sort : 962 [msec]
[Timing] (Rank 50) Exchange : 2072 [msec]
[Timing] (Rank 50) Min-Max : 1107 [msec]
[Timing] (Rank 50) Elbow-Sort: 968 [msec]
[Timing] (Rank 63) Total : 5966 [msec]
[Timing] (Rank 63) Full-Sort : 919 [msec]
[Timing] (Rank 63) Exchange : 2821 [msec]
[Timing] (Rank 63) Min-Max : 697 [msec]
[Timing] (Rank 63) Elbow-Sort: 972 [msec]
[Timing] (Rank 48) Total : 5987 [msec]
[Timing] (Rank 48) Full-Sort : 968 [msec]
[Timing] (Rank 48) Exchange : 2469 [msec]
[Timing] (Rank 48) Min-Max : 898 [msec]
[Timing] (Rank 48) Elbow-Sort: 961 [msec]
@@ -0,0 +1,342 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 23) Total : 23 [sec]
[Timing] (Rank 23) Full-Sort : 3558 [msec]
[Timing] (Rank 23) Exchange : 11 [sec]
[Timing] (Rank 23) Min-Max : 2555 [msec]
[Timing] (Rank 23) Elbow-Sort: 3950 [msec]
[Timing] (Rank 5) Total : 23 [sec]
[Timing] (Rank 5) Full-Sort : 3731 [msec]
[Timing] (Rank 5) Exchange : 11 [sec]
[Timing] (Rank 5) Min-Max : 1605 [msec]
[Timing] (Rank 5) Elbow-Sort: 3909 [msec]
[Timing] (Rank 52) Total : 23 [sec]
[Timing] (Rank 52) Full-Sort : 4200 [msec]
[Timing] (Rank 52) Exchange : 8933 [msec]
[Timing] (Rank 52) Min-Max : 3594 [msec]
[Timing] (Rank 52) Elbow-Sort: 3915 [msec]
[Timing] (Rank 45) Total : 23 [sec]
[Timing] (Rank 45) Full-Sort : 3978 [msec]
[Timing] (Rank 45) Exchange : 8836 [msec]
[Timing] (Rank 45) Min-Max : 3794 [msec]
[Timing] (Rank 45) Elbow-Sort: 3869 [msec]
[Timing] (Rank 27) Total : 24 [sec]
[Timing] (Rank 27) Full-Sort : 3619 [msec]
[Timing] (Rank 27) Exchange : 10 [sec]
[Timing] (Rank 27) Min-Max : 3079 [msec]
[Timing] (Rank 27) Elbow-Sort: 3923 [msec]
[Timing] (Rank 18) Total : 23 [sec]
[Timing] (Rank 18) Full-Sort : 3556 [msec]
[Timing] (Rank 18) Exchange : 9545 [msec]
[Timing] (Rank 18) Min-Max : 3023 [msec]
[Timing] (Rank 18) Elbow-Sort: 3962 [msec]
[Timing] (Rank 16) Total : 24 [sec]
[Timing] (Rank 16) Full-Sort : 3569 [msec]
[Timing] (Rank 16) Exchange : 11 [sec]
[Timing] (Rank 16) Min-Max : 2427 [msec]
[Timing] (Rank 16) Elbow-Sort: 3926 [msec]
[Timing] (Rank 24) Total : 23 [sec]
[Timing] (Rank 24) Full-Sort : 3727 [msec]
[Timing] (Rank 24) Exchange : 10 [sec]
[Timing] (Rank 24) Min-Max : 3038 [msec]
[Timing] (Rank 24) Elbow-Sort: 3886 [msec]
[Timing] (Rank 22) Total : 23 [sec]
[Timing] (Rank 22) Full-Sort : 3619 [msec]
[Timing] (Rank 22) Exchange : 10 [sec]
[Timing] (Rank 22) Min-Max : 2836 [msec]
[Timing] (Rank 22) Elbow-Sort: 3916 [msec]
[Timing] (Rank 31) Total : 24 [sec]
[Timing] (Rank 31) Full-Sort : 3611 [msec]
[Timing] (Rank 31) Exchange : 12 [sec]
[Timing] (Rank 31) Min-Max : 2210 [msec]
[Timing] (Rank 31) Elbow-Sort: 3900 [msec]
[Timing] (Rank 19) Total : 23 [sec]
[Timing] (Rank 19) Full-Sort : 3572 [msec]
[Timing] (Rank 19) Exchange : 9695 [msec]
[Timing] (Rank 19) Min-Max : 3253 [msec]
[Timing] (Rank 19) Elbow-Sort: 3979 [msec]
[Timing] (Rank 26) Total : 24 [sec]
[Timing] (Rank 26) Full-Sort : 3716 [msec]
[Timing] (Rank 26) Exchange : 11 [sec]
[Timing] (Rank 26) Min-Max : 2659 [msec]
[Timing] (Rank 26) Elbow-Sort: 3861 [msec]
[Timing] (Rank 25) Total : 23 [sec]
[Timing] (Rank 25) Full-Sort : 3578 [msec]
[Timing] (Rank 25) Exchange : 8884 [msec]
[Timing] (Rank 25) Min-Max : 3827 [msec]
[Timing] (Rank 25) Elbow-Sort: 3910 [msec]
[Timing] (Rank 17) Total : 24 [sec]
[Timing] (Rank 17) Full-Sort : 3551 [msec]
[Timing] (Rank 17) Exchange : 10 [sec]
[Timing] (Rank 17) Min-Max : 2987 [msec]
[Timing] (Rank 17) Elbow-Sort: 4033 [msec]
[Timing] (Rank 30) Total : 24 [sec]
[Timing] (Rank 30) Full-Sort : 3735 [msec]
[Timing] (Rank 30) Exchange : 10 [sec]
[Timing] (Rank 30) Min-Max : 2824 [msec]
[Timing] (Rank 30) Elbow-Sort: 3880 [msec]
[Timing] (Rank 20) Total : 23 [sec]
[Timing] (Rank 20) Full-Sort : 3655 [msec]
[Timing] (Rank 20) Exchange : 11 [sec]
[Timing] (Rank 20) Min-Max : 2490 [msec]
[Timing] (Rank 20) Elbow-Sort: 3941 [msec]
[Timing] (Rank 28) Total : 24 [sec]
[Timing] (Rank 28) Full-Sort : 3740 [msec]
[Timing] (Rank 28) Exchange : 9382 [msec]
[Timing] (Rank 28) Min-Max : 3518 [msec]
[Timing] (Rank 28) Elbow-Sort: 3887 [msec]
[Timing] (Rank 21) Total : 23 [sec]
[Timing] (Rank 21) Full-Sort : 3587 [msec]
[Timing] (Rank 21) Exchange : 12 [sec]
[Timing] (Rank 21) Min-Max : 1935 [msec]
[Timing] (Rank 21) Elbow-Sort: 3959 [msec]
[Timing] (Rank 29) Total : 24 [sec]
[Timing] (Rank 29) Full-Sort : 3631 [msec]
[Timing] (Rank 29) Exchange : 10 [sec]
[Timing] (Rank 29) Min-Max : 2951 [msec]
[Timing] (Rank 29) Elbow-Sort: 3887 [msec]
[Timing] (Rank 7) Total : 23 [sec]
[Timing] (Rank 7) Full-Sort : 3708 [msec]
[Timing] (Rank 7) Exchange : 10 [sec]
[Timing] (Rank 7) Min-Max : 2305 [msec]
[Timing] (Rank 7) Elbow-Sort: 3838 [msec]
[Timing] (Rank 1) Total : 23 [sec]
[Timing] (Rank 1) Full-Sort : 3685 [msec]
[Timing] (Rank 1) Exchange : 11 [sec]
[Timing] (Rank 1) Min-Max : 1692 [msec]
[Timing] (Rank 1) Elbow-Sort: 3875 [msec]
[Timing] (Rank 12) Total : 23 [sec]
[Timing] (Rank 12) Full-Sort : 3860 [msec]
[Timing] (Rank 12) Exchange : 9665 [msec]
[Timing] (Rank 12) Min-Max : 2793 [msec]
[Timing] (Rank 12) Elbow-Sort: 3704 [msec]
[Timing] (Rank 0) Total : 23 [sec]
[Timing] (Rank 0) Full-Sort : 3917 [msec]
[Timing] (Rank 0) Exchange : 13 [sec]
[Timing] (Rank 0) Min-Max : 1021 [msec]
[Timing] (Rank 0) Elbow-Sort: 3818 [msec]
Results validation ... [PASS] 
[Timing] (Rank 8) Total : 23 [sec]
[Timing] (Rank 8) Full-Sort : 3874 [msec]
[Timing] (Rank 8) Exchange : 10 [sec]
[Timing] (Rank 8) Min-Max : 2403 [msec]
[Timing] (Rank 8) Elbow-Sort: 3759 [msec]
[Timing] (Rank 2) Total : 23 [sec]
[Timing] (Rank 2) Full-Sort : 3851 [msec]
[Timing] (Rank 2) Exchange : 11 [sec]
[Timing] (Rank 2) Min-Max : 1664 [msec]
[Timing] (Rank 2) Elbow-Sort: 3877 [msec]
[Timing] (Rank 15) Total : 23 [sec]
[Timing] (Rank 15) Full-Sort : 3698 [msec]
[Timing] (Rank 15) Exchange : 11 [sec]
[Timing] (Rank 15) Min-Max : 1851 [msec]
[Timing] (Rank 15) Elbow-Sort: 3754 [msec]
[Timing] (Rank 4) Total : 23 [sec]
[Timing] (Rank 4) Full-Sort : 3837 [msec]
[Timing] (Rank 4) Exchange : 11 [sec]
[Timing] (Rank 4) Min-Max : 2036 [msec]
[Timing] (Rank 4) Elbow-Sort: 3867 [msec]
[Timing] (Rank 6) Total : 23 [sec]
[Timing] (Rank 6) Full-Sort : 3840 [msec]
[Timing] (Rank 6) Exchange : 9850 [msec]
[Timing] (Rank 6) Min-Max : 2619 [msec]
[Timing] (Rank 6) Elbow-Sort: 3762 [msec]
[Timing] (Rank 3) Total : 23 [sec]
[Timing] (Rank 3) Full-Sort : 3700 [msec]
[Timing] (Rank 3) Exchange : 10 [sec]
[Timing] (Rank 3) Min-Max : 2501 [msec]
[Timing] (Rank 3) Elbow-Sort: 3820 [msec]
[Timing] (Rank 11) Total : 23 [sec]
[Timing] (Rank 11) Full-Sort : 3722 [msec]
[Timing] (Rank 11) Exchange : 10 [sec]
[Timing] (Rank 11) Min-Max : 2315 [msec]
[Timing] (Rank 11) Elbow-Sort: 3751 [msec]
[Timing] (Rank 10) Total : 23 [sec]
[Timing] (Rank 10) Full-Sort : 3853 [msec]
[Timing] (Rank 10) Exchange : 11 [sec]
[Timing] (Rank 10) Min-Max : 2050 [msec]
[Timing] (Rank 10) Elbow-Sort: 3734 [msec]
[Timing] (Rank 13) Total : 23 [sec]
[Timing] (Rank 13) Full-Sort : 3679 [msec]
[Timing] (Rank 13) Exchange : 10 [sec]
[Timing] (Rank 13) Min-Max : 2261 [msec]
[Timing] (Rank 13) Elbow-Sort: 3785 [msec]
[Timing] (Rank 9) Total : 23 [sec]
[Timing] (Rank 9) Full-Sort : 3702 [msec]
[Timing] (Rank 9) Exchange : 10 [sec]
[Timing] (Rank 9) Min-Max : 2424 [msec]
[Timing] (Rank 9) Elbow-Sort: 3843 [msec]
[Timing] (Rank 14) Total : 23 [sec]
[Timing] (Rank 14) Full-Sort : 3849 [msec]
[Timing] (Rank 14) Exchange : 10 [sec]
[Timing] (Rank 14) Min-Max : 2378 [msec]
[Timing] (Rank 14) Elbow-Sort: 3692 [msec]
[Timing] (Rank 60) Total : 23 [sec]
[Timing] (Rank 60) Full-Sort : 4165 [msec]
[Timing] (Rank 60) Exchange : 8414 [msec]
[Timing] (Rank 60) Min-Max : 3702 [msec]
[Timing] (Rank 60) Elbow-Sort: 3959 [msec]
[Timing] (Rank 48) Total : 23 [sec]
[Timing] (Rank 48) Full-Sort : 4026 [msec]
[Timing] (Rank 48) Exchange : 9067 [msec]
[Timing] (Rank 48) Min-Max : 3759 [msec]
[Timing] (Rank 48) Elbow-Sort: 3899 [msec]
[Timing] (Rank 57) Total : 23 [sec]
[Timing] (Rank 57) Full-Sort : 4108 [msec]
[Timing] (Rank 57) Exchange : 7689 [msec]
[Timing] (Rank 57) Min-Max : 4305 [msec]
[Timing] (Rank 57) Elbow-Sort: 3978 [msec]
[Timing] (Rank 53) Total : 23 [sec]
[Timing] (Rank 53) Full-Sort : 4118 [msec]
[Timing] (Rank 53) Exchange : 9305 [msec]
[Timing] (Rank 53) Min-Max : 3401 [msec]
[Timing] (Rank 53) Elbow-Sort: 3933 [msec]
[Timing] (Rank 50) Total : 23 [sec]
[Timing] (Rank 50) Full-Sort : 4179 [msec]
[Timing] (Rank 50) Exchange : 7482 [msec]
[Timing] (Rank 50) Min-Max : 4517 [msec]
[Timing] (Rank 50) Elbow-Sort: 3952 [msec]
[Timing] (Rank 51) Total : 23 [sec]
[Timing] (Rank 51) Full-Sort : 3944 [msec]
[Timing] (Rank 51) Exchange : 7271 [msec]
[Timing] (Rank 51) Min-Max : 4695 [msec]
[Timing] (Rank 51) Elbow-Sort: 3930 [msec]
[Timing] (Rank 56) Total : 23 [sec]
[Timing] (Rank 56) Full-Sort : 4198 [msec]
[Timing] (Rank 56) Exchange : 8006 [msec]
[Timing] (Rank 56) Min-Max : 4098 [msec]
[Timing] (Rank 56) Elbow-Sort: 3956 [msec]
[Timing] (Rank 61) Total : 23 [sec]
[Timing] (Rank 61) Full-Sort : 4061 [msec]
[Timing] (Rank 61) Exchange : 10 [sec]
[Timing] (Rank 61) Min-Max : 3043 [msec]
[Timing] (Rank 61) Elbow-Sort: 3965 [msec]
[Timing] (Rank 62) Total : 23 [sec]
[Timing] (Rank 62) Full-Sort : 4147 [msec]
[Timing] (Rank 62) Exchange : 10 [sec]
[Timing] (Rank 62) Min-Max : 3043 [msec]
[Timing] (Rank 62) Elbow-Sort: 3937 [msec]
[Timing] (Rank 63) Total : 23 [sec]
[Timing] (Rank 63) Full-Sort : 3926 [msec]
[Timing] (Rank 63) Exchange : 11 [sec]
[Timing] (Rank 63) Min-Max : 2316 [msec]
[Timing] (Rank 63) Elbow-Sort: 3929 [msec]
[Timing] (Rank 49) Total : 23 [sec]
[Timing] (Rank 49) Full-Sort : 4064 [msec]
[Timing] (Rank 49) Exchange : 7821 [msec]
[Timing] (Rank 49) Min-Max : 4277 [msec]
[Timing] (Rank 49) Elbow-Sort: 3962 [msec]
[Timing] (Rank 54) Total : 23 [sec]
[Timing] (Rank 54) Full-Sort : 4208 [msec]
[Timing] (Rank 54) Exchange : 7894 [msec]
[Timing] (Rank 54) Min-Max : 4225 [msec]
[Timing] (Rank 54) Elbow-Sort: 3906 [msec]
[Timing] (Rank 59) Total : 23 [sec]
[Timing] (Rank 59) Full-Sort : 4063 [msec]
[Timing] (Rank 59) Exchange : 9230 [msec]
[Timing] (Rank 59) Min-Max : 3648 [msec]
[Timing] (Rank 59) Elbow-Sort: 3881 [msec]
[Timing] (Rank 55) Total : 23 [sec]
[Timing] (Rank 55) Full-Sort : 4051 [msec]
[Timing] (Rank 55) Exchange : 8558 [msec]
[Timing] (Rank 55) Min-Max : 3839 [msec]
[Timing] (Rank 55) Elbow-Sort: 3912 [msec]
[Timing] (Rank 58) Total : 23 [sec]
[Timing] (Rank 58) Full-Sort : 4216 [msec]
[Timing] (Rank 58) Exchange : 9316 [msec]
[Timing] (Rank 58) Min-Max : 3588 [msec]
[Timing] (Rank 58) Elbow-Sort: 3844 [msec]
[Timing] (Rank 34) Total : 23 [sec]
[Timing] (Rank 34) Full-Sort : 4182 [msec]
[Timing] (Rank 34) Exchange : 8636 [msec]
[Timing] (Rank 34) Min-Max : 3876 [msec]
[Timing] (Rank 34) Elbow-Sort: 3895 [msec]
[Timing] (Rank 32) Total : 23 [sec]
[Timing] (Rank 32) Full-Sort : 4169 [msec]
[Timing] (Rank 32) Exchange : 10 [sec]
[Timing] (Rank 32) Min-Max : 2996 [msec]
[Timing] (Rank 32) Elbow-Sort: 4069 [msec]
[Timing] (Rank 36) Total : 23 [sec]
[Timing] (Rank 36) Full-Sort : 4203 [msec]
[Timing] (Rank 36) Exchange : 8507 [msec]
[Timing] (Rank 36) Min-Max : 3652 [msec]
[Timing] (Rank 36) Elbow-Sort: 3949 [msec]
[Timing] (Rank 44) Total : 23 [sec]
[Timing] (Rank 44) Full-Sort : 4159 [msec]
[Timing] (Rank 44) Exchange : 8016 [msec]
[Timing] (Rank 44) Min-Max : 4191 [msec]
[Timing] (Rank 44) Elbow-Sort: 3848 [msec]
[Timing] (Rank 38) Total : 23 [sec]
[Timing] (Rank 38) Full-Sort : 4206 [msec]
[Timing] (Rank 38) Exchange : 6955 [msec]
[Timing] (Rank 38) Min-Max : 4664 [msec]
[Timing] (Rank 38) Elbow-Sort: 3863 [msec]
[Timing] (Rank 40) Total : 23 [sec]
[Timing] (Rank 40) Full-Sort : 4207 [msec]
[Timing] (Rank 40) Exchange : 10 [sec]
[Timing] (Rank 40) Min-Max : 2704 [msec]
[Timing] (Rank 40) Elbow-Sort: 3937 [msec]
[Timing] (Rank 43) Total : 23 [sec]
[Timing] (Rank 43) Full-Sort : 4151 [msec]
[Timing] (Rank 43) Exchange : 10 [sec]
[Timing] (Rank 43) Min-Max : 2923 [msec]
[Timing] (Rank 43) Elbow-Sort: 3920 [msec]
[Timing] (Rank 42) Total : 23 [sec]
[Timing] (Rank 42) Full-Sort : 4236 [msec]
[Timing] (Rank 42) Exchange : 11 [sec]
[Timing] (Rank 42) Min-Max : 2392 [msec]
[Timing] (Rank 42) Elbow-Sort: 3957 [msec]
[Timing] (Rank 46) Total : 23 [sec]
[Timing] (Rank 46) Full-Sort : 4175 [msec]
[Timing] (Rank 46) Exchange : 8866 [msec]
[Timing] (Rank 46) Min-Max : 3829 [msec]
[Timing] (Rank 46) Elbow-Sort: 3817 [msec]
[Timing] (Rank 41) Total : 23 [sec]
[Timing] (Rank 41) Full-Sort : 4190 [msec]
[Timing] (Rank 41) Exchange : 9234 [msec]
[Timing] (Rank 41) Min-Max : 3263 [msec]
[Timing] (Rank 41) Elbow-Sort: 4000 [msec]
[Timing] (Rank 39) Total : 23 [sec]
[Timing] (Rank 39) Full-Sort : 4040 [msec]
[Timing] (Rank 39) Exchange : 8247 [msec]
[Timing] (Rank 39) Min-Max : 4068 [msec]
[Timing] (Rank 39) Elbow-Sort: 3900 [msec]
[Timing] (Rank 47) Total : 23 [sec]
[Timing] (Rank 47) Full-Sort : 3949 [msec]
[Timing] (Rank 47) Exchange : 9993 [msec]
[Timing] (Rank 47) Min-Max : 3150 [msec]
[Timing] (Rank 47) Elbow-Sort: 3821 [msec]
[Timing] (Rank 37) Total : 23 [sec]
[Timing] (Rank 37) Full-Sort : 4140 [msec]
[Timing] (Rank 37) Exchange : 8504 [msec]
[Timing] (Rank 37) Min-Max : 3643 [msec]
[Timing] (Rank 37) Elbow-Sort: 3906 [msec]
[Timing] (Rank 35) Total : 23 [sec]
[Timing] (Rank 35) Full-Sort : 3988 [msec]
[Timing] (Rank 35) Exchange : 7886 [msec]
[Timing] (Rank 35) Min-Max : 4338 [msec]
[Timing] (Rank 35) Elbow-Sort: 3925 [msec]
[Timing] (Rank 33) Total : 23 [sec]
[Timing] (Rank 33) Full-Sort : 3909 [msec]
[Timing] (Rank 33) Exchange : 8920 [msec]
[Timing] (Rank 33) Min-Max : 3730 [msec]
[Timing] (Rank 33) Elbow-Sort: 3994 [msec]
@@ -0,0 +1,102 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 11) Total : 92 [msec]
[Timing] (Rank 11) Full-Sort : 18 [msec]
[Timing] (Rank 11) Exchange : 38 [msec]
[Timing] (Rank 11) Min-Max : 6507 [usec]
[Timing] (Rank 11) Elbow-Sort: 18 [msec]
[Timing] (Rank 7) Total : 95 [msec]
[Timing] (Rank 7) Full-Sort : 19 [msec]
[Timing] (Rank 7) Exchange : 38 [msec]
[Timing] (Rank 7) Min-Max : 8194 [usec]
[Timing] (Rank 7) Elbow-Sort: 18 [msec]
[Timing] (Rank 14) Total : 92 [msec]
[Timing] (Rank 14) Full-Sort : 19 [msec]
[Timing] (Rank 14) Exchange : 33 [msec]
[Timing] (Rank 14) Min-Max : 8867 [usec]
[Timing] (Rank 14) Elbow-Sort: 18 [msec]
[Timing] (Rank 1) Total : 96 [msec]
[Timing] (Rank 1) Full-Sort : 22 [msec]
[Timing] (Rank 1) Exchange : 28 [msec]
[Timing] (Rank 1) Min-Max : 8576 [usec]
[Timing] (Rank 1) Elbow-Sort: 22 [msec]
[Timing] (Rank 10) Total : 92 [msec]
[Timing] (Rank 10) Full-Sort : 19 [msec]
[Timing] (Rank 10) Exchange : 37 [msec]
[Timing] (Rank 10) Min-Max : 6457 [usec]
[Timing] (Rank 10) Elbow-Sort: 18 [msec]
[Timing] (Rank 9) Total : 92 [msec]
[Timing] (Rank 9) Full-Sort : 18 [msec]
[Timing] (Rank 9) Exchange : 32 [msec]
[Timing] (Rank 9) Min-Max : 8483 [usec]
[Timing] (Rank 9) Elbow-Sort: 18 [msec]
[Timing] (Rank 8) Total : 92 [msec]
[Timing] (Rank 8) Full-Sort : 19 [msec]
[Timing] (Rank 8) Exchange : 35 [msec]
[Timing] (Rank 8) Min-Max : 7576 [usec]
[Timing] (Rank 8) Elbow-Sort: 18 [msec]
[Timing] (Rank 4) Total : 96 [msec]
[Timing] (Rank 4) Full-Sort : 19 [msec]
[Timing] (Rank 4) Exchange : 37 [msec]
[Timing] (Rank 4) Min-Max : 8161 [usec]
[Timing] (Rank 4) Elbow-Sort: 18 [msec]
[Timing] (Rank 5) Total : 96 [msec]
[Timing] (Rank 5) Full-Sort : 18 [msec]
[Timing] (Rank 5) Exchange : 39 [msec]
[Timing] (Rank 5) Min-Max : 7305 [usec]
[Timing] (Rank 5) Elbow-Sort: 19 [msec]
[Timing] (Rank 6) Total : 96 [msec]
[Timing] (Rank 6) Full-Sort : 19 [msec]
[Timing] (Rank 6) Exchange : 33 [msec]
[Timing] (Rank 6) Min-Max : 10 [msec]
[Timing] (Rank 6) Elbow-Sort: 18 [msec]
[Timing] (Rank 12) Total : 90 [msec]
[Timing] (Rank 12) Full-Sort : 19 [msec]
[Timing] (Rank 12) Exchange : 28 [msec]
[Timing] (Rank 12) Min-Max : 9247 [usec]
[Timing] (Rank 12) Elbow-Sort: 18 [msec]
[Timing] (Rank 13) Total : 92 [msec]
[Timing] (Rank 13) Full-Sort : 18 [msec]
[Timing] (Rank 13) Exchange : 38 [msec]
[Timing] (Rank 13) Min-Max : 6283 [usec]
[Timing] (Rank 13) Elbow-Sort: 18 [msec]
[Timing] (Rank 15) Total : 92 [msec]
[Timing] (Rank 15) Full-Sort : 18 [msec]
[Timing] (Rank 15) Exchange : 42 [msec]
[Timing] (Rank 15) Min-Max : 4769 [usec]
[Timing] (Rank 15) Elbow-Sort: 18 [msec]
[Timing] (Rank 0) Total : 96 [msec]
[Timing] (Rank 0) Full-Sort : 23 [msec]
[Timing] (Rank 0) Exchange : 34 [msec]
[Timing] (Rank 0) Min-Max : 6433 [usec]
[Timing] (Rank 0) Elbow-Sort: 21 [msec]
Results validation ... [PASS] 
[Timing] (Rank 2) Total : 97 [msec]
[Timing] (Rank 2) Full-Sort : 23 [msec]
[Timing] (Rank 2) Exchange : 27 [msec]
[Timing] (Rank 2) Min-Max : 9269 [usec]
[Timing] (Rank 2) Elbow-Sort: 21 [msec]
[Timing] (Rank 3) Total : 96 [msec]
[Timing] (Rank 3) Full-Sort : 22 [msec]
[Timing] (Rank 3) Exchange : 26 [msec]
[Timing] (Rank 3) Min-Max : 10 [msec]
[Timing] (Rank 3) Elbow-Sort: 21 [msec]
@@ -0,0 +1,102 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 10) Total : 730 [msec]
[Timing] (Rank 10) Full-Sort : 178 [msec]
[Timing] (Rank 10) Exchange : 297 [msec]
[Timing] (Rank 10) Min-Max : 39 [msec]
[Timing] (Rank 10) Elbow-Sort: 151 [msec]
[Timing] (Rank 14) Total : 736 [msec]
[Timing] (Rank 14) Full-Sort : 178 [msec]
[Timing] (Rank 14) Exchange : 255 [msec]
[Timing] (Rank 14) Min-Max : 64 [msec]
[Timing] (Rank 14) Elbow-Sort: 150 [msec]
[Timing] (Rank 1) Total : 760 [msec]
[Timing] (Rank 1) Full-Sort : 211 [msec]
[Timing] (Rank 1) Exchange : 159 [msec]
[Timing] (Rank 1) Min-Max : 78 [msec]
[Timing] (Rank 1) Elbow-Sort: 188 [msec]
[Timing] (Rank 7) Total : 756 [msec]
[Timing] (Rank 7) Full-Sort : 179 [msec]
[Timing] (Rank 7) Exchange : 236 [msec]
[Timing] (Rank 7) Min-Max : 80 [msec]
[Timing] (Rank 7) Elbow-Sort: 160 [msec]
[Timing] (Rank 9) Total : 732 [msec]
[Timing] (Rank 9) Full-Sort : 173 [msec]
[Timing] (Rank 9) Exchange : 226 [msec]
[Timing] (Rank 9) Min-Max : 67 [msec]
[Timing] (Rank 9) Elbow-Sort: 153 [msec]
[Timing] (Rank 11) Total : 732 [msec]
[Timing] (Rank 11) Full-Sort : 172 [msec]
[Timing] (Rank 11) Exchange : 268 [msec]
[Timing] (Rank 11) Min-Max : 54 [msec]
[Timing] (Rank 11) Elbow-Sort: 153 [msec]
[Timing] (Rank 8) Total : 734 [msec]
[Timing] (Rank 8) Full-Sort : 183 [msec]
[Timing] (Rank 8) Exchange : 256 [msec]
[Timing] (Rank 8) Min-Max : 54 [msec]
[Timing] (Rank 8) Elbow-Sort: 158 [msec]
[Timing] (Rank 13) Total : 738 [msec]
[Timing] (Rank 13) Full-Sort : 172 [msec]
[Timing] (Rank 13) Exchange : 234 [msec]
[Timing] (Rank 13) Min-Max : 70 [msec]
[Timing] (Rank 13) Elbow-Sort: 154 [msec]
[Timing] (Rank 15) Total : 735 [msec]
[Timing] (Rank 15) Full-Sort : 174 [msec]
[Timing] (Rank 15) Exchange : 269 [msec]
[Timing] (Rank 15) Min-Max : 56 [msec]
[Timing] (Rank 15) Elbow-Sort: 150 [msec]
[Timing] (Rank 12) Total : 738 [msec]
[Timing] (Rank 12) Full-Sort : 186 [msec]
[Timing] (Rank 12) Exchange : 208 [msec]
[Timing] (Rank 12) Min-Max : 77 [msec]
[Timing] (Rank 12) Elbow-Sort: 152 [msec]
[Timing] (Rank 2) Total : 755 [msec]
[Timing] (Rank 2) Full-Sort : 217 [msec]
[Timing] (Rank 2) Exchange : 150 [msec]
[Timing] (Rank 2) Min-Max : 78 [msec]
[Timing] (Rank 2) Elbow-Sort: 185 [msec]
[Timing] (Rank 3) Total : 755 [msec]
[Timing] (Rank 3) Full-Sort : 211 [msec]
[Timing] (Rank 3) Exchange : 141 [msec]
[Timing] (Rank 3) Min-Max : 87 [msec]
[Timing] (Rank 3) Elbow-Sort: 188 [msec]
[Timing] (Rank 0) Total : 759 [msec]
[Timing] (Rank 0) Full-Sort : 218 [msec]
[Timing] (Rank 0) Exchange : 218 [msec]
[Timing] (Rank 0) Min-Max : 59 [msec]
[Timing] (Rank 0) Elbow-Sort: 183 [msec]
Results validation ... [PASS] 
[Timing] (Rank 4) Total : 748 [msec]
[Timing] (Rank 4) Full-Sort : 185 [msec]
[Timing] (Rank 4) Exchange : 231 [msec]
[Timing] (Rank 4) Min-Max : 78 [msec]
[Timing] (Rank 4) Elbow-Sort: 159 [msec]
[Timing] (Rank 5) Total : 748 [msec]
[Timing] (Rank 5) Full-Sort : 180 [msec]
[Timing] (Rank 5) Exchange : 243 [msec]
[Timing] (Rank 5) Min-Max : 73 [msec]
[Timing] (Rank 5) Elbow-Sort: 159 [msec]
[Timing] (Rank 6) Total : 754 [msec]
[Timing] (Rank 6) Full-Sort : 186 [msec]
[Timing] (Rank 6) Exchange : 201 [msec]
[Timing] (Rank 6) Min-Max : 95 [msec]
[Timing] (Rank 6) Elbow-Sort: 157 [msec]
@@ -0,0 +1,102 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 11) Total : 2967 [msec]
[Timing] (Rank 11) Full-Sort : 754 [msec]
[Timing] (Rank 11) Exchange : 936 [msec]
[Timing] (Rank 11) Min-Max : 265 [msec]
[Timing] (Rank 11) Elbow-Sort: 623 [msec]
[Timing] (Rank 13) Total : 3014 [msec]
[Timing] (Rank 13) Full-Sort : 747 [msec]
[Timing] (Rank 13) Exchange : 991 [msec]
[Timing] (Rank 13) Min-Max : 259 [msec]
[Timing] (Rank 13) Elbow-Sort: 622 [msec]
[Timing] (Rank 4) Total : 3099 [msec]
[Timing] (Rank 4) Full-Sort : 783 [msec]
[Timing] (Rank 4) Exchange : 970 [msec]
[Timing] (Rank 4) Min-Max : 322 [msec]
[Timing] (Rank 4) Elbow-Sort: 648 [msec]
[Timing] (Rank 3) Total : 3124 [msec]
[Timing] (Rank 3) Full-Sort : 908 [msec]
[Timing] (Rank 3) Exchange : 511 [msec]
[Timing] (Rank 3) Min-Max : 421 [msec]
[Timing] (Rank 3) Elbow-Sort: 747 [msec]
[Timing] (Rank 10) Total : 2963 [msec]
[Timing] (Rank 10) Full-Sort : 775 [msec]
[Timing] (Rank 10) Exchange : 942 [msec]
[Timing] (Rank 10) Min-Max : 264 [msec]
[Timing] (Rank 10) Elbow-Sort: 613 [msec]
[Timing] (Rank 9) Total : 2985 [msec]
[Timing] (Rank 9) Full-Sort : 742 [msec]
[Timing] (Rank 9) Exchange : 880 [msec]
[Timing] (Rank 9) Min-Max : 293 [msec]
[Timing] (Rank 9) Elbow-Sort: 627 [msec]
[Timing] (Rank 8) Total : 2999 [msec]
[Timing] (Rank 8) Full-Sort : 788 [msec]
[Timing] (Rank 8) Exchange : 918 [msec]
[Timing] (Rank 8) Min-Max : 260 [msec]
[Timing] (Rank 8) Elbow-Sort: 648 [msec]
[Timing] (Rank 15) Total : 3008 [msec]
[Timing] (Rank 15) Full-Sort : 751 [msec]
[Timing] (Rank 15) Exchange : 1155 [msec]
[Timing] (Rank 15) Min-Max : 201 [msec]
[Timing] (Rank 15) Elbow-Sort: 612 [msec]
[Timing] (Rank 14) Total : 3010 [msec]
[Timing] (Rank 14) Full-Sort : 777 [msec]
[Timing] (Rank 14) Exchange : 856 [msec]
[Timing] (Rank 14) Min-Max : 327 [msec]
[Timing] (Rank 14) Elbow-Sort: 615 [msec]
[Timing] (Rank 12) Total : 3017 [msec]
[Timing] (Rank 12) Full-Sort : 791 [msec]
[Timing] (Rank 12) Exchange : 824 [msec]
[Timing] (Rank 12) Min-Max : 321 [msec]
[Timing] (Rank 12) Elbow-Sort: 620 [msec]
[Timing] (Rank 7) Total : 3118 [msec]
[Timing] (Rank 7) Full-Sort : 752 [msec]
[Timing] (Rank 7) Exchange : 1011 [msec]
[Timing] (Rank 7) Min-Max : 319 [msec]
[Timing] (Rank 7) Elbow-Sort: 636 [msec]
[Timing] (Rank 5) Total : 3100 [msec]
[Timing] (Rank 5) Full-Sort : 751 [msec]
[Timing] (Rank 5) Exchange : 944 [msec]
[Timing] (Rank 5) Min-Max : 329 [msec]
[Timing] (Rank 5) Elbow-Sort: 656 [msec]
[Timing] (Rank 6) Total : 3116 [msec]
[Timing] (Rank 6) Full-Sort : 783 [msec]
[Timing] (Rank 6) Exchange : 846 [msec]
[Timing] (Rank 6) Min-Max : 391 [msec]
[Timing] (Rank 6) Elbow-Sort: 636 [msec]
[Timing] (Rank 2) Total : 3117 [msec]
[Timing] (Rank 2) Full-Sort : 943 [msec]
[Timing] (Rank 2) Exchange : 509 [msec]
[Timing] (Rank 2) Min-Max : 386 [msec]
[Timing] (Rank 2) Elbow-Sort: 729 [msec]
[Timing] (Rank 0) Total : 3161 [msec]
[Timing] (Rank 0) Full-Sort : 944 [msec]
[Timing] (Rank 0) Exchange : 814 [msec]
[Timing] (Rank 0) Min-Max : 310 [msec]
[Timing] (Rank 0) Elbow-Sort: 745 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 3159 [msec]
[Timing] (Rank 1) Full-Sort : 904 [msec]
[Timing] (Rank 1) Exchange : 606 [msec]
[Timing] (Rank 1) Min-Max : 379 [msec]
[Timing] (Rank 1) Elbow-Sort: 747 [msec]
@@ -0,0 +1,102 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 13) Total : 12 [sec]
[Timing] (Rank 13) Full-Sort : 3198 [msec]
[Timing] (Rank 13) Exchange : 3265 [msec]
[Timing] (Rank 13) Min-Max : 1228 [msec]
[Timing] (Rank 13) Elbow-Sort: 2520 [msec]
[Timing] (Rank 10) Total : 11 [sec]
[Timing] (Rank 10) Full-Sort : 3345 [msec]
[Timing] (Rank 10) Exchange : 4184 [msec]
[Timing] (Rank 10) Min-Max : 749 [msec]
[Timing] (Rank 10) Elbow-Sort: 2492 [msec]
[Timing] (Rank 4) Total : 12 [sec]
[Timing] (Rank 4) Full-Sort : 3399 [msec]
[Timing] (Rank 4) Exchange : 3766 [msec]
[Timing] (Rank 4) Min-Max : 1216 [msec]
[Timing] (Rank 4) Elbow-Sort: 2567 [msec]
[Timing] (Rank 3) Total : 12 [sec]
[Timing] (Rank 3) Full-Sort : 3864 [msec]
[Timing] (Rank 3) Exchange : 2290 [msec]
[Timing] (Rank 3) Min-Max : 1397 [msec]
[Timing] (Rank 3) Elbow-Sort: 3016 [msec]
[Timing] (Rank 14) Total : 12 [sec]
[Timing] (Rank 14) Full-Sort : 3346 [msec]
[Timing] (Rank 14) Exchange : 3491 [msec]
[Timing] (Rank 14) Min-Max : 1109 [msec]
[Timing] (Rank 14) Elbow-Sort: 2475 [msec]
[Timing] (Rank 15) Total : 12 [sec]
[Timing] (Rank 15) Full-Sort : 3220 [msec]
[Timing] (Rank 15) Exchange : 3742 [msec]
[Timing] (Rank 15) Min-Max : 1014 [msec]
[Timing] (Rank 15) Elbow-Sort: 2482 [msec]
[Timing] (Rank 12) Total : 12 [sec]
[Timing] (Rank 12) Full-Sort : 3406 [msec]
[Timing] (Rank 12) Exchange : 3126 [msec]
[Timing] (Rank 12) Min-Max : 1218 [msec]
[Timing] (Rank 12) Elbow-Sort: 2494 [msec]
[Timing] (Rank 9) Total : 11 [sec]
[Timing] (Rank 9) Full-Sort : 3210 [msec]
[Timing] (Rank 9) Exchange : 3341 [msec]
[Timing] (Rank 9) Min-Max : 1063 [msec]
[Timing] (Rank 9) Elbow-Sort: 2497 [msec]
[Timing] (Rank 11) Total : 11 [sec]
[Timing] (Rank 11) Full-Sort : 3221 [msec]
[Timing] (Rank 11) Exchange : 3910 [msec]
[Timing] (Rank 11) Min-Max : 859 [msec]
[Timing] (Rank 11) Elbow-Sort: 2481 [msec]
[Timing] (Rank 8) Total : 11 [sec]
[Timing] (Rank 8) Full-Sort : 3369 [msec]
[Timing] (Rank 8) Exchange : 3771 [msec]
[Timing] (Rank 8) Min-Max : 835 [msec]
[Timing] (Rank 8) Elbow-Sort: 2560 [msec]
[Timing] (Rank 1) Total : 12 [sec]
[Timing] (Rank 1) Full-Sort : 3886 [msec]
[Timing] (Rank 1) Exchange : 2577 [msec]
[Timing] (Rank 1) Min-Max : 1229 [msec]
[Timing] (Rank 1) Elbow-Sort: 3045 [msec]
[Timing] (Rank 2) Total : 12 [sec]
[Timing] (Rank 2) Full-Sort : 4035 [msec]
[Timing] (Rank 2) Exchange : 3099 [msec]
[Timing] (Rank 2) Min-Max : 981 [msec]
[Timing] (Rank 2) Elbow-Sort: 2976 [msec]
[Timing] (Rank 0) Total : 12 [sec]
[Timing] (Rank 0) Full-Sort : 4048 [msec]
[Timing] (Rank 0) Exchange : 4046 [msec]
[Timing] (Rank 0) Min-Max : 648 [msec]
[Timing] (Rank 0) Elbow-Sort: 2977 [msec]
Results validation ... [PASS] 
[Timing] (Rank 6) Total : 12 [sec]
[Timing] (Rank 6) Full-Sort : 3388 [msec]
[Timing] (Rank 6) Exchange : 3293 [msec]
[Timing] (Rank 6) Min-Max : 1457 [msec]
[Timing] (Rank 6) Elbow-Sort: 2556 [msec]
[Timing] (Rank 5) Total : 12 [sec]
[Timing] (Rank 5) Full-Sort : 3245 [msec]
[Timing] (Rank 5) Exchange : 3710 [msec]
[Timing] (Rank 5) Min-Max : 1211 [msec]
[Timing] (Rank 5) Elbow-Sort: 2624 [msec]
[Timing] (Rank 7) Total : 12 [sec]
[Timing] (Rank 7) Full-Sort : 3247 [msec]
[Timing] (Rank 7) Exchange : 3678 [msec]
[Timing] (Rank 7) Min-Max : 1326 [msec]
[Timing] (Rank 7) Elbow-Sort: 2579 [msec]
@@ -0,0 +1,182 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 19) Total : 114 [msec]
[Timing] (Rank 19) Full-Sort : 19 [msec]
[Timing] (Rank 19) Exchange : 34 [msec]
[Timing] (Rank 19) Min-Max : 17 [msec]
[Timing] (Rank 19) Elbow-Sort: 23 [msec]
[Timing] (Rank 24) Total : 120 [msec]
[Timing] (Rank 24) Full-Sort : 20 [msec]
[Timing] (Rank 24) Exchange : 40 [msec]
[Timing] (Rank 24) Min-Max : 15 [msec]
[Timing] (Rank 24) Elbow-Sort: 23 [msec]
[Timing] (Rank 12) Total : 135 [msec]
[Timing] (Rank 12) Full-Sort : 20 [msec]
[Timing] (Rank 12) Exchange : 55 [msec]
[Timing] (Rank 12) Min-Max : 15 [msec]
[Timing] (Rank 12) Elbow-Sort: 23 [msec]
[Timing] (Rank 2) Total : 139 [msec]
[Timing] (Rank 2) Full-Sort : 20 [msec]
[Timing] (Rank 2) Exchange : 63 [msec]
[Timing] (Rank 2) Min-Max : 11 [msec]
[Timing] (Rank 2) Elbow-Sort: 23 [msec]
[Timing] (Rank 21) Total : 114 [msec]
[Timing] (Rank 21) Full-Sort : 20 [msec]
[Timing] (Rank 21) Exchange : 45 [msec]
[Timing] (Rank 21) Min-Max : 11 [msec]
[Timing] (Rank 21) Elbow-Sort: 23 [msec]
[Timing] (Rank 18) Total : 116 [msec]
[Timing] (Rank 18) Full-Sort : 21 [msec]
[Timing] (Rank 18) Exchange : 37 [msec]
[Timing] (Rank 18) Min-Max : 15 [msec]
[Timing] (Rank 18) Elbow-Sort: 23 [msec]
[Timing] (Rank 20) Total : 113 [msec]
[Timing] (Rank 20) Full-Sort : 20 [msec]
[Timing] (Rank 20) Exchange : 43 [msec]
[Timing] (Rank 20) Min-Max : 11 [msec]
[Timing] (Rank 20) Elbow-Sort: 23 [msec]
[Timing] (Rank 22) Total : 114 [msec]
[Timing] (Rank 22) Full-Sort : 20 [msec]
[Timing] (Rank 22) Exchange : 40 [msec]
[Timing] (Rank 22) Min-Max : 14 [msec]
[Timing] (Rank 22) Elbow-Sort: 22 [msec]
[Timing] (Rank 23) Total : 115 [msec]
[Timing] (Rank 23) Full-Sort : 19 [msec]
[Timing] (Rank 23) Exchange : 44 [msec]
[Timing] (Rank 23) Min-Max : 12 [msec]
[Timing] (Rank 23) Elbow-Sort: 23 [msec]
[Timing] (Rank 17) Total : 115 [msec]
[Timing] (Rank 17) Full-Sort : 19 [msec]
[Timing] (Rank 17) Exchange : 34 [msec]
[Timing] (Rank 17) Min-Max : 16 [msec]
[Timing] (Rank 17) Elbow-Sort: 23 [msec]
[Timing] (Rank 16) Total : 116 [msec]
[Timing] (Rank 16) Full-Sort : 20 [msec]
[Timing] (Rank 16) Exchange : 46 [msec]
[Timing] (Rank 16) Min-Max : 11 [msec]
[Timing] (Rank 16) Elbow-Sort: 23 [msec]
[Timing] (Rank 29) Total : 118 [msec]
[Timing] (Rank 29) Full-Sort : 19 [msec]
[Timing] (Rank 29) Exchange : 52 [msec]
[Timing] (Rank 29) Min-Max : 10 [msec]
[Timing] (Rank 29) Elbow-Sort: 22 [msec]
[Timing] (Rank 8) Total : 138 [msec]
[Timing] (Rank 8) Full-Sort : 20 [msec]
[Timing] (Rank 8) Exchange : 69 [msec]
[Timing] (Rank 8) Min-Max : 10 [msec]
[Timing] (Rank 8) Elbow-Sort: 23 [msec]
[Timing] (Rank 31) Total : 119 [msec]
[Timing] (Rank 31) Full-Sort : 20 [msec]
[Timing] (Rank 31) Exchange : 58 [msec]
[Timing] (Rank 31) Min-Max : 7051 [usec]
[Timing] (Rank 31) Elbow-Sort: 22 [msec]
[Timing] (Rank 26) Total : 119 [msec]
[Timing] (Rank 26) Full-Sort : 20 [msec]
[Timing] (Rank 26) Exchange : 48 [msec]
[Timing] (Rank 26) Min-Max : 12 [msec]
[Timing] (Rank 26) Elbow-Sort: 23 [msec]
[Timing] (Rank 27) Total : 119 [msec]
[Timing] (Rank 27) Full-Sort : 19 [msec]
[Timing] (Rank 27) Exchange : 45 [msec]
[Timing] (Rank 27) Min-Max : 13 [msec]
[Timing] (Rank 27) Elbow-Sort: 22 [msec]
[Timing] (Rank 28) Total : 119 [msec]
[Timing] (Rank 28) Full-Sort : 20 [msec]
[Timing] (Rank 28) Exchange : 40 [msec]
[Timing] (Rank 28) Min-Max : 15 [msec]
[Timing] (Rank 28) Elbow-Sort: 22 [msec]
[Timing] (Rank 14) Total : 135 [msec]
[Timing] (Rank 14) Full-Sort : 20 [msec]
[Timing] (Rank 14) Exchange : 57 [msec]
[Timing] (Rank 14) Min-Max : 14 [msec]
[Timing] (Rank 14) Elbow-Sort: 23 [msec]
[Timing] (Rank 30) Total : 119 [msec]
[Timing] (Rank 30) Full-Sort : 20 [msec]
[Timing] (Rank 30) Exchange : 48 [msec]
[Timing] (Rank 30) Min-Max : 12 [msec]
[Timing] (Rank 30) Elbow-Sort: 22 [msec]
[Timing] (Rank 11) Total : 137 [msec]
[Timing] (Rank 11) Full-Sort : 19 [msec]
[Timing] (Rank 11) Exchange : 65 [msec]
[Timing] (Rank 11) Min-Max : 12 [msec]
[Timing] (Rank 11) Elbow-Sort: 23 [msec]
[Timing] (Rank 25) Total : 119 [msec]
[Timing] (Rank 25) Full-Sort : 19 [msec]
[Timing] (Rank 25) Exchange : 36 [msec]
[Timing] (Rank 25) Min-Max : 17 [msec]
[Timing] (Rank 25) Elbow-Sort: 23 [msec]
[Timing] (Rank 13) Total : 135 [msec]
[Timing] (Rank 13) Full-Sort : 20 [msec]
[Timing] (Rank 13) Exchange : 40 [msec]
[Timing] (Rank 13) Min-Max : 32 [msec]
[Timing] (Rank 13) Elbow-Sort: 23 [msec]
[Timing] (Rank 10) Total : 137 [msec]
[Timing] (Rank 10) Full-Sort : 20 [msec]
[Timing] (Rank 10) Exchange : 69 [msec]
[Timing] (Rank 10) Min-Max : 9921 [usec]
[Timing] (Rank 10) Elbow-Sort: 23 [msec]
[Timing] (Rank 9) Total : 138 [msec]
[Timing] (Rank 9) Full-Sort : 19 [msec]
[Timing] (Rank 9) Exchange : 60 [msec]
[Timing] (Rank 9) Min-Max : 14 [msec]
[Timing] (Rank 9) Elbow-Sort: 23 [msec]
[Timing] (Rank 15) Total : 134 [msec]
[Timing] (Rank 15) Full-Sort : 19 [msec]
[Timing] (Rank 15) Exchange : 66 [msec]
[Timing] (Rank 15) Min-Max : 10 [msec]
[Timing] (Rank 15) Elbow-Sort: 23 [msec]
[Timing] (Rank 1) Total : 139 [msec]
[Timing] (Rank 1) Full-Sort : 20 [msec]
[Timing] (Rank 1) Exchange : 66 [msec]
[Timing] (Rank 1) Min-Max : 11 [msec]
[Timing] (Rank 1) Elbow-Sort: 23 [msec]
[Timing] (Rank 6) Total : 138 [msec]
[Timing] (Rank 6) Full-Sort : 20 [msec]
[Timing] (Rank 6) Exchange : 59 [msec]
[Timing] (Rank 6) Min-Max : 14 [msec]
[Timing] (Rank 6) Elbow-Sort: 23 [msec]
[Timing] (Rank 7) Total : 136 [msec]
[Timing] (Rank 7) Full-Sort : 20 [msec]
[Timing] (Rank 7) Exchange : 55 [msec]
[Timing] (Rank 7) Min-Max : 19 [msec]
[Timing] (Rank 7) Elbow-Sort: 23 [msec]
[Timing] (Rank 0) Total : 140 [msec]
[Timing] (Rank 0) Full-Sort : 21 [msec]
[Timing] (Rank 0) Exchange : 74 [msec]
[Timing] (Rank 0) Min-Max : 8514 [usec]
[Timing] (Rank 0) Elbow-Sort: 24 [msec]
Results validation ... [PASS] 
[Timing] (Rank 3) Total : 139 [msec]
[Timing] (Rank 3) Full-Sort : 20 [msec]
[Timing] (Rank 3) Exchange : 63 [msec]
[Timing] (Rank 3) Min-Max : 13 [msec]
[Timing] (Rank 3) Elbow-Sort: 24 [msec]
[Timing] (Rank 4) Total : 137 [msec]
[Timing] (Rank 4) Full-Sort : 20 [msec]
[Timing] (Rank 4) Exchange : 66 [msec]
[Timing] (Rank 4) Min-Max : 10 [msec]
[Timing] (Rank 4) Elbow-Sort: 23 [msec]
[Timing] (Rank 5) Total : 136 [msec]
[Timing] (Rank 5) Full-Sort : 20 [msec]
[Timing] (Rank 5) Exchange : 62 [msec]
[Timing] (Rank 5) Min-Max : 10 [msec]
[Timing] (Rank 5) Elbow-Sort: 24 [msec]
@@ -0,0 +1,182 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 22) Total : 1016 [msec]
[Timing] (Rank 22) Full-Sort : 190 [msec]
[Timing] (Rank 22) Exchange : 387 [msec]
[Timing] (Rank 22) Min-Max : 114 [msec]
[Timing] (Rank 22) Elbow-Sort: 191 [msec]
[Timing] (Rank 15) Total : 1056 [msec]
[Timing] (Rank 15) Full-Sort : 201 [msec]
[Timing] (Rank 15) Exchange : 431 [msec]
[Timing] (Rank 15) Min-Max : 114 [msec]
[Timing] (Rank 15) Elbow-Sort: 198 [msec]
[Timing] (Rank 1) Total : 1050 [msec]
[Timing] (Rank 1) Full-Sort : 176 [msec]
[Timing] (Rank 1) Exchange : 462 [msec]
[Timing] (Rank 1) Min-Max : 82 [msec]
[Timing] (Rank 1) Elbow-Sort: 193 [msec]
[Timing] (Rank 31) Total : 1026 [msec]
[Timing] (Rank 31) Full-Sort : 185 [msec]
[Timing] (Rank 31) Exchange : 480 [msec]
[Timing] (Rank 31) Min-Max : 75 [msec]
[Timing] (Rank 31) Elbow-Sort: 194 [msec]
[Timing] (Rank 18) Total : 1022 [msec]
[Timing] (Rank 18) Full-Sort : 189 [msec]
[Timing] (Rank 18) Exchange : 408 [msec]
[Timing] (Rank 18) Min-Max : 104 [msec]
[Timing] (Rank 18) Elbow-Sort: 190 [msec]
[Timing] (Rank 19) Total : 1025 [msec]
[Timing] (Rank 19) Full-Sort : 185 [msec]
[Timing] (Rank 19) Exchange : 359 [msec]
[Timing] (Rank 19) Min-Max : 128 [msec]
[Timing] (Rank 19) Elbow-Sort: 191 [msec]
[Timing] (Rank 20) Total : 1009 [msec]
[Timing] (Rank 20) Full-Sort : 189 [msec]
[Timing] (Rank 20) Exchange : 419 [msec]
[Timing] (Rank 20) Min-Max : 90 [msec]
[Timing] (Rank 20) Elbow-Sort: 191 [msec]
[Timing] (Rank 21) Total : 1010 [msec]
[Timing] (Rank 21) Full-Sort : 184 [msec]
[Timing] (Rank 21) Exchange : 456 [msec]
[Timing] (Rank 21) Min-Max : 74 [msec]
[Timing] (Rank 21) Elbow-Sort: 194 [msec]
[Timing] (Rank 16) Total : 1022 [msec]
[Timing] (Rank 16) Full-Sort : 190 [msec]
[Timing] (Rank 16) Exchange : 475 [msec]
[Timing] (Rank 16) Min-Max : 74 [msec]
[Timing] (Rank 16) Elbow-Sort: 193 [msec]
[Timing] (Rank 23) Total : 1015 [msec]
[Timing] (Rank 23) Full-Sort : 185 [msec]
[Timing] (Rank 23) Exchange : 461 [msec]
[Timing] (Rank 23) Min-Max : 83 [msec]
[Timing] (Rank 23) Elbow-Sort: 190 [msec]
[Timing] (Rank 17) Total : 1022 [msec]
[Timing] (Rank 17) Full-Sort : 184 [msec]
[Timing] (Rank 17) Exchange : 354 [msec]
[Timing] (Rank 17) Min-Max : 123 [msec]
[Timing] (Rank 17) Elbow-Sort: 194 [msec]
[Timing] (Rank 13) Total : 1051 [msec]
[Timing] (Rank 13) Full-Sort : 197 [msec]
[Timing] (Rank 13) Exchange : 351 [msec]
[Timing] (Rank 13) Min-Max : 152 [msec]
[Timing] (Rank 13) Elbow-Sort: 201 [msec]
[Timing] (Rank 12) Total : 1050 [msec]
[Timing] (Rank 12) Full-Sort : 204 [msec]
[Timing] (Rank 12) Exchange : 290 [msec]
[Timing] (Rank 12) Min-Max : 184 [msec]
[Timing] (Rank 12) Elbow-Sort: 199 [msec]
[Timing] (Rank 14) Total : 1058 [msec]
[Timing] (Rank 14) Full-Sort : 205 [msec]
[Timing] (Rank 14) Exchange : 347 [msec]
[Timing] (Rank 14) Min-Max : 156 [msec]
[Timing] (Rank 14) Elbow-Sort: 200 [msec]
[Timing] (Rank 10) Total : 1056 [msec]
[Timing] (Rank 10) Full-Sort : 200 [msec]
[Timing] (Rank 10) Exchange : 402 [msec]
[Timing] (Rank 10) Min-Max : 126 [msec]
[Timing] (Rank 10) Elbow-Sort: 201 [msec]
[Timing] (Rank 9) Total : 1057 [msec]
[Timing] (Rank 9) Full-Sort : 189 [msec]
[Timing] (Rank 9) Exchange : 335 [msec]
[Timing] (Rank 9) Min-Max : 161 [msec]
[Timing] (Rank 9) Elbow-Sort: 206 [msec]
[Timing] (Rank 11) Total : 1055 [msec]
[Timing] (Rank 11) Full-Sort : 199 [msec]
[Timing] (Rank 11) Exchange : 386 [msec]
[Timing] (Rank 11) Min-Max : 134 [msec]
[Timing] (Rank 11) Elbow-Sort: 201 [msec]
[Timing] (Rank 8) Total : 1057 [msec]
[Timing] (Rank 8) Full-Sort : 199 [msec]
[Timing] (Rank 8) Exchange : 358 [msec]
[Timing] (Rank 8) Min-Max : 152 [msec]
[Timing] (Rank 8) Elbow-Sort: 209 [msec]
[Timing] (Rank 2) Total : 1048 [msec]
[Timing] (Rank 2) Full-Sort : 181 [msec]
[Timing] (Rank 2) Exchange : 470 [msec]
[Timing] (Rank 2) Min-Max : 75 [msec]
[Timing] (Rank 2) Elbow-Sort: 194 [msec]
[Timing] (Rank 5) Total : 1036 [msec]
[Timing] (Rank 5) Full-Sort : 175 [msec]
[Timing] (Rank 5) Exchange : 439 [msec]
[Timing] (Rank 5) Min-Max : 82 [msec]
[Timing] (Rank 5) Elbow-Sort: 197 [msec]
[Timing] (Rank 6) Total : 1043 [msec]
[Timing] (Rank 6) Full-Sort : 180 [msec]
[Timing] (Rank 6) Exchange : 404 [msec]
[Timing] (Rank 6) Min-Max : 105 [msec]
[Timing] (Rank 6) Elbow-Sort: 194 [msec]
[Timing] (Rank 0) Total : 1050 [msec]
[Timing] (Rank 0) Full-Sort : 181 [msec]
[Timing] (Rank 0) Exchange : 542 [msec]
[Timing] (Rank 0) Min-Max : 52 [msec]
[Timing] (Rank 0) Elbow-Sort: 198 [msec]
Results validation ... [PASS] 
[Timing] (Rank 3) Total : 1049 [msec]
[Timing] (Rank 3) Full-Sort : 175 [msec]
[Timing] (Rank 3) Exchange : 438 [msec]
[Timing] (Rank 3) Min-Max : 97 [msec]
[Timing] (Rank 3) Elbow-Sort: 193 [msec]
[Timing] (Rank 4) Total : 1035 [msec]
[Timing] (Rank 4) Full-Sort : 181 [msec]
[Timing] (Rank 4) Exchange : 455 [msec]
[Timing] (Rank 4) Min-Max : 82 [msec]
[Timing] (Rank 4) Elbow-Sort: 192 [msec]
[Timing] (Rank 7) Total : 1041 [msec]
[Timing] (Rank 7) Full-Sort : 176 [msec]
[Timing] (Rank 7) Exchange : 441 [msec]
[Timing] (Rank 7) Min-Max : 92 [msec]
[Timing] (Rank 7) Elbow-Sort: 193 [msec]
[Timing] (Rank 24) Total : 1021 [msec]
[Timing] (Rank 24) Full-Sort : 190 [msec]
[Timing] (Rank 24) Exchange : 353 [msec]
[Timing] (Rank 24) Min-Max : 129 [msec]
[Timing] (Rank 24) Elbow-Sort: 197 [msec]
[Timing] (Rank 29) Total : 1023 [msec]
[Timing] (Rank 29) Full-Sort : 186 [msec]
[Timing] (Rank 29) Exchange : 425 [msec]
[Timing] (Rank 29) Min-Max : 100 [msec]
[Timing] (Rank 29) Elbow-Sort: 197 [msec]
[Timing] (Rank 28) Total : 1021 [msec]
[Timing] (Rank 28) Full-Sort : 191 [msec]
[Timing] (Rank 28) Exchange : 346 [msec]
[Timing] (Rank 28) Min-Max : 130 [msec]
[Timing] (Rank 28) Elbow-Sort: 195 [msec]
[Timing] (Rank 27) Total : 1011 [msec]
[Timing] (Rank 27) Full-Sort : 183 [msec]
[Timing] (Rank 27) Exchange : 377 [msec]
[Timing] (Rank 27) Min-Max : 112 [msec]
[Timing] (Rank 27) Elbow-Sort: 195 [msec]
[Timing] (Rank 25) Total : 1020 [msec]
[Timing] (Rank 25) Full-Sort : 184 [msec]
[Timing] (Rank 25) Exchange : 320 [msec]
[Timing] (Rank 25) Min-Max : 143 [msec]
[Timing] (Rank 25) Elbow-Sort: 195 [msec]
[Timing] (Rank 30) Total : 1027 [msec]
[Timing] (Rank 30) Full-Sort : 191 [msec]
[Timing] (Rank 30) Exchange : 388 [msec]
[Timing] (Rank 30) Min-Max : 116 [msec]
[Timing] (Rank 30) Elbow-Sort: 195 [msec]
[Timing] (Rank 26) Total : 1013 [msec]
[Timing] (Rank 26) Full-Sort : 190 [msec]
[Timing] (Rank 26) Exchange : 381 [msec]
[Timing] (Rank 26) Min-Max : 116 [msec]
[Timing] (Rank 26) Elbow-Sort: 195 [msec]
@@ -0,0 +1,182 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 26) Total : 4253 [msec]
[Timing] (Rank 26) Full-Sort : 811 [msec]
[Timing] (Rank 26) Exchange : 1293 [msec]
[Timing] (Rank 26) Min-Max : 700 [msec]
[Timing] (Rank 26) Elbow-Sort: 801 [msec]
[Timing] (Rank 16) Total : 4159 [msec]
[Timing] (Rank 16) Full-Sort : 810 [msec]
[Timing] (Rank 16) Exchange : 1625 [msec]
[Timing] (Rank 16) Min-Max : 446 [msec]
[Timing] (Rank 16) Elbow-Sort: 829 [msec]
[Timing] (Rank 15) Total : 4164 [msec]
[Timing] (Rank 15) Full-Sort : 858 [msec]
[Timing] (Rank 15) Exchange : 1602 [msec]
[Timing] (Rank 15) Min-Max : 428 [msec]
[Timing] (Rank 15) Elbow-Sort: 822 [msec]
[Timing] (Rank 2) Total : 4164 [msec]
[Timing] (Rank 2) Full-Sort : 779 [msec]
[Timing] (Rank 2) Exchange : 1542 [msec]
[Timing] (Rank 2) Min-Max : 409 [msec]
[Timing] (Rank 2) Elbow-Sort: 803 [msec]
[Timing] (Rank 29) Total : 4303 [msec]
[Timing] (Rank 29) Full-Sort : 776 [msec]
[Timing] (Rank 29) Exchange : 1687 [msec]
[Timing] (Rank 29) Min-Max : 526 [msec]
[Timing] (Rank 29) Elbow-Sort: 808 [msec]
[Timing] (Rank 30) Total : 4299 [msec]
[Timing] (Rank 30) Full-Sort : 802 [msec]
[Timing] (Rank 30) Exchange : 1498 [msec]
[Timing] (Rank 30) Min-Max : 639 [msec]
[Timing] (Rank 30) Elbow-Sort: 800 [msec]
[Timing] (Rank 25) Total : 4260 [msec]
[Timing] (Rank 25) Full-Sort : 769 [msec]
[Timing] (Rank 25) Exchange : 1216 [msec]
[Timing] (Rank 25) Min-Max : 752 [msec]
[Timing] (Rank 25) Elbow-Sort: 799 [msec]
[Timing] (Rank 31) Total : 4299 [msec]
[Timing] (Rank 31) Full-Sort : 786 [msec]
[Timing] (Rank 31) Exchange : 1945 [msec]
[Timing] (Rank 31) Min-Max : 402 [msec]
[Timing] (Rank 31) Elbow-Sort: 797 [msec]
[Timing] (Rank 27) Total : 4252 [msec]
[Timing] (Rank 27) Full-Sort : 774 [msec]
[Timing] (Rank 27) Exchange : 1505 [msec]
[Timing] (Rank 27) Min-Max : 592 [msec]
[Timing] (Rank 27) Elbow-Sort: 801 [msec]
[Timing] (Rank 24) Total : 4271 [msec]
[Timing] (Rank 24) Full-Sort : 800 [msec]
[Timing] (Rank 24) Exchange : 1205 [msec]
[Timing] (Rank 24) Min-Max : 759 [msec]
[Timing] (Rank 24) Elbow-Sort: 805 [msec]
[Timing] (Rank 28) Total : 4300 [msec]
[Timing] (Rank 28) Full-Sort : 804 [msec]
[Timing] (Rank 28) Exchange : 1322 [msec]
[Timing] (Rank 28) Min-Max : 712 [msec]
[Timing] (Rank 28) Elbow-Sort: 806 [msec]
[Timing] (Rank 23) Total : 4221 [msec]
[Timing] (Rank 23) Full-Sort : 767 [msec]
[Timing] (Rank 23) Exchange : 1632 [msec]
[Timing] (Rank 23) Min-Max : 495 [msec]
[Timing] (Rank 23) Elbow-Sort: 797 [msec]
[Timing] (Rank 20) Total : 4245 [msec]
[Timing] (Rank 20) Full-Sort : 797 [msec]
[Timing] (Rank 20) Exchange : 1688 [msec]
[Timing] (Rank 20) Min-Max : 461 [msec]
[Timing] (Rank 20) Elbow-Sort: 810 [msec]
[Timing] (Rank 19) Total : 4197 [msec]
[Timing] (Rank 19) Full-Sort : 787 [msec]
[Timing] (Rank 19) Exchange : 1309 [msec]
[Timing] (Rank 19) Min-Max : 628 [msec]
[Timing] (Rank 19) Elbow-Sort: 815 [msec]
[Timing] (Rank 21) Total : 4242 [msec]
[Timing] (Rank 21) Full-Sort : 770 [msec]
[Timing] (Rank 21) Exchange : 1802 [msec]
[Timing] (Rank 21) Min-Max : 410 [msec]
[Timing] (Rank 21) Elbow-Sort: 808 [msec]
[Timing] (Rank 22) Total : 4223 [msec]
[Timing] (Rank 22) Full-Sort : 796 [msec]
[Timing] (Rank 22) Exchange : 1516 [msec]
[Timing] (Rank 22) Min-Max : 557 [msec]
[Timing] (Rank 22) Elbow-Sort: 801 [msec]
[Timing] (Rank 18) Total : 4192 [msec]
[Timing] (Rank 18) Full-Sort : 796 [msec]
[Timing] (Rank 18) Exchange : 1430 [msec]
[Timing] (Rank 18) Min-Max : 582 [msec]
[Timing] (Rank 18) Elbow-Sort: 804 [msec]
[Timing] (Rank 17) Total : 4226 [msec]
[Timing] (Rank 17) Full-Sort : 738 [msec]
[Timing] (Rank 17) Exchange : 1449 [msec]
[Timing] (Rank 17) Min-Max : 590 [msec]
[Timing] (Rank 17) Elbow-Sort: 807 [msec]
[Timing] (Rank 10) Total : 4159 [msec]
[Timing] (Rank 10) Full-Sort : 857 [msec]
[Timing] (Rank 10) Exchange : 1600 [msec]
[Timing] (Rank 10) Min-Max : 427 [msec]
[Timing] (Rank 10) Elbow-Sort: 827 [msec]
[Timing] (Rank 11) Total : 4167 [msec]
[Timing] (Rank 11) Full-Sort : 811 [msec]
[Timing] (Rank 11) Exchange : 1370 [msec]
[Timing] (Rank 11) Min-Max : 551 [msec]
[Timing] (Rank 11) Elbow-Sort: 840 [msec]
[Timing] (Rank 13) Total : 4145 [msec]
[Timing] (Rank 13) Full-Sort : 855 [msec]
[Timing] (Rank 13) Exchange : 1334 [msec]
[Timing] (Rank 13) Min-Max : 564 [msec]
[Timing] (Rank 13) Elbow-Sort: 822 [msec]
[Timing] (Rank 14) Total : 4156 [msec]
[Timing] (Rank 14) Full-Sort : 881 [msec]
[Timing] (Rank 14) Exchange : 1340 [msec]
[Timing] (Rank 14) Min-Max : 561 [msec]
[Timing] (Rank 14) Elbow-Sort: 819 [msec]
[Timing] (Rank 9) Total : 4160 [msec]
[Timing] (Rank 9) Full-Sort : 822 [msec]
[Timing] (Rank 9) Exchange : 1255 [msec]
[Timing] (Rank 9) Min-Max : 603 [msec]
[Timing] (Rank 9) Elbow-Sort: 835 [msec]
[Timing] (Rank 8) Total : 4163 [msec]
[Timing] (Rank 8) Full-Sort : 853 [msec]
[Timing] (Rank 8) Exchange : 1378 [msec]
[Timing] (Rank 8) Min-Max : 559 [msec]
[Timing] (Rank 8) Elbow-Sort: 825 [msec]
[Timing] (Rank 12) Total : 4142 [msec]
[Timing] (Rank 12) Full-Sort : 885 [msec]
[Timing] (Rank 12) Exchange : 1047 [msec]
[Timing] (Rank 12) Min-Max : 704 [msec]
[Timing] (Rank 12) Elbow-Sort: 813 [msec]
[Timing] (Rank 7) Total : 4136 [msec]
[Timing] (Rank 7) Full-Sort : 749 [msec]
[Timing] (Rank 7) Exchange : 1577 [msec]
[Timing] (Rank 7) Min-Max : 448 [msec]
[Timing] (Rank 7) Elbow-Sort: 787 [msec]
[Timing] (Rank 6) Total : 4136 [msec]
[Timing] (Rank 6) Full-Sort : 786 [msec]
[Timing] (Rank 6) Exchange : 1429 [msec]
[Timing] (Rank 6) Min-Max : 481 [msec]
[Timing] (Rank 6) Elbow-Sort: 784 [msec]
[Timing] (Rank 3) Total : 4164 [msec]
[Timing] (Rank 3) Full-Sort : 758 [msec]
[Timing] (Rank 3) Exchange : 1502 [msec]
[Timing] (Rank 3) Min-Max : 473 [msec]
[Timing] (Rank 3) Elbow-Sort: 804 [msec]
[Timing] (Rank 5) Total : 4118 [msec]
[Timing] (Rank 5) Full-Sort : 759 [msec]
[Timing] (Rank 5) Exchange : 1570 [msec]
[Timing] (Rank 5) Min-Max : 369 [msec]
[Timing] (Rank 5) Elbow-Sort: 818 [msec]
[Timing] (Rank 4) Total : 4116 [msec]
[Timing] (Rank 4) Full-Sort : 784 [msec]
[Timing] (Rank 4) Exchange : 1640 [msec]
[Timing] (Rank 4) Min-Max : 374 [msec]
[Timing] (Rank 4) Elbow-Sort: 805 [msec]
[Timing] (Rank 0) Total : 4174 [msec]
[Timing] (Rank 0) Full-Sort : 785 [msec]
[Timing] (Rank 0) Exchange : 1895 [msec]
[Timing] (Rank 0) Min-Max : 308 [msec]
[Timing] (Rank 0) Elbow-Sort: 808 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 4159 [msec]
[Timing] (Rank 1) Full-Sort : 751 [msec]
[Timing] (Rank 1) Exchange : 1687 [msec]
[Timing] (Rank 1) Min-Max : 374 [msec]
[Timing] (Rank 1) Elbow-Sort: 793 [msec]
@@ -0,0 +1,182 @@
Autoloading hwloc/2.2.0
Autoloading numactl/2.0.14
Autoloading zlib/1.2.11
Autoloading slurm/17-11-8-1
Autoloading ucx/1.9.0
Autoloading rdma-core/32.0
Autoloading libnl/3.3.0
Autoloading singularity/3.6.4
Autoloading go/1.15.2
Autoloading libgpg-error/1.37
Autoloading libseccomp/2.3.3
Autoloading squashfs/4.4
Autoloading shadow/4.7
Autoloading cryptsetup/2.3.1
Autoloading lvm2/2.03.05
Autoloading popt/1.16
Autoloading json-c/0.13.1
Autoloading util-linux/2.35.1
Autoloading python/3.8.6
Autoloading pkgconf/1.7.3
Autoloading openssl/1.1.1h
[Timing] (Rank 24) Total : 15 [sec]
[Timing] (Rank 24) Full-Sort : 3662 [msec]
[Timing] (Rank 24) Exchange : 5222 [msec]
[Timing] (Rank 24) Min-Max : 1710 [msec]
[Timing] (Rank 24) Elbow-Sort: 3183 [msec]
[Timing] (Rank 21) Total : 15 [sec]
[Timing] (Rank 21) Full-Sort : 3437 [msec]
[Timing] (Rank 21) Exchange : 6362 [msec]
[Timing] (Rank 21) Min-Max : 1139 [msec]
[Timing] (Rank 21) Elbow-Sort: 3176 [msec]
[Timing] (Rank 6) Total : 16 [sec]
[Timing] (Rank 6) Full-Sort : 3427 [msec]
[Timing] (Rank 6) Exchange : 6034 [msec]
[Timing] (Rank 6) Min-Max : 1677 [msec]
[Timing] (Rank 6) Elbow-Sort: 3131 [msec]
[Timing] (Rank 12) Total : 17 [sec]
[Timing] (Rank 12) Full-Sort : 3758 [msec]
[Timing] (Rank 12) Exchange : 4542 [msec]
[Timing] (Rank 12) Min-Max : 2874 [msec]
[Timing] (Rank 12) Elbow-Sort: 3237 [msec]
[Timing] (Rank 23) Total : 15 [sec]
[Timing] (Rank 23) Full-Sort : 3440 [msec]
[Timing] (Rank 23) Exchange : 6227 [msec]
[Timing] (Rank 23) Min-Max : 1319 [msec]
[Timing] (Rank 23) Elbow-Sort: 3079 [msec]
[Timing] (Rank 19) Total : 15 [sec]
[Timing] (Rank 19) Full-Sort : 3359 [msec]
[Timing] (Rank 19) Exchange : 4881 [msec]
[Timing] (Rank 19) Min-Max : 2006 [msec]
[Timing] (Rank 19) Elbow-Sort: 3142 [msec]
[Timing] (Rank 16) Total : 15 [sec]
[Timing] (Rank 16) Full-Sort : 3485 [msec]
[Timing] (Rank 16) Exchange : 5827 [msec]
[Timing] (Rank 16) Min-Max : 1602 [msec]
[Timing] (Rank 16) Elbow-Sort: 3121 [msec]
[Timing] (Rank 31) Total : 16 [sec]
[Timing] (Rank 31) Full-Sort : 3397 [msec]
[Timing] (Rank 31) Exchange : 6894 [msec]
[Timing] (Rank 31) Min-Max : 1175 [msec]
[Timing] (Rank 31) Elbow-Sort: 3156 [msec]
[Timing] (Rank 22) Total : 15 [sec]
[Timing] (Rank 22) Full-Sort : 3622 [msec]
[Timing] (Rank 22) Exchange : 5212 [msec]
[Timing] (Rank 22) Min-Max : 1766 [msec]
[Timing] (Rank 22) Elbow-Sort: 3110 [msec]
[Timing] (Rank 25) Total : 15 [sec]
[Timing] (Rank 25) Full-Sort : 3531 [msec]
[Timing] (Rank 25) Exchange : 4401 [msec]
[Timing] (Rank 25) Min-Max : 2085 [msec]
[Timing] (Rank 25) Elbow-Sort: 3215 [msec]
[Timing] (Rank 29) Total : 16 [sec]
[Timing] (Rank 29) Full-Sort : 3557 [msec]
[Timing] (Rank 29) Exchange : 5822 [msec]
[Timing] (Rank 29) Min-Max : 1590 [msec]
[Timing] (Rank 29) Elbow-Sort: 3172 [msec]
[Timing] (Rank 26) Total : 15 [sec]
[Timing] (Rank 26) Full-Sort : 3617 [msec]
[Timing] (Rank 26) Exchange : 5646 [msec]
[Timing] (Rank 26) Min-Max : 1539 [msec]
[Timing] (Rank 26) Elbow-Sort: 3179 [msec]
[Timing] (Rank 17) Total : 15 [sec]
[Timing] (Rank 17) Full-Sort : 3358 [msec]
[Timing] (Rank 17) Exchange : 4867 [msec]
[Timing] (Rank 17) Min-Max : 1963 [msec]
[Timing] (Rank 17) Elbow-Sort: 3159 [msec]
[Timing] (Rank 27) Total : 15 [sec]
[Timing] (Rank 27) Full-Sort : 3518 [msec]
[Timing] (Rank 27) Exchange : 5303 [msec]
[Timing] (Rank 27) Min-Max : 1668 [msec]
[Timing] (Rank 27) Elbow-Sort: 3206 [msec]
[Timing] (Rank 28) Total : 16 [sec]
[Timing] (Rank 28) Full-Sort : 3642 [msec]
[Timing] (Rank 28) Exchange : 5166 [msec]
[Timing] (Rank 28) Min-Max : 1870 [msec]
[Timing] (Rank 28) Elbow-Sort: 3123 [msec]
[Timing] (Rank 30) Total : 15 [sec]
[Timing] (Rank 30) Full-Sort : 3565 [msec]
[Timing] (Rank 30) Exchange : 5366 [msec]
[Timing] (Rank 30) Min-Max : 1740 [msec]
[Timing] (Rank 30) Elbow-Sort: 3137 [msec]
[Timing] (Rank 18) Total : 15 [sec]
[Timing] (Rank 18) Full-Sort : 3505 [msec]
[Timing] (Rank 18) Exchange : 4655 [msec]
[Timing] (Rank 18) Min-Max : 2021 [msec]
[Timing] (Rank 18) Elbow-Sort: 3106 [msec]
[Timing] (Rank 20) Total : 15 [sec]
[Timing] (Rank 20) Full-Sort : 3553 [msec]
[Timing] (Rank 20) Exchange : 6075 [msec]
[Timing] (Rank 20) Min-Max : 1303 [msec]
[Timing] (Rank 20) Elbow-Sort: 3138 [msec]
[Timing] (Rank 2) Total : 16 [sec]
[Timing] (Rank 2) Full-Sort : 3405 [msec]
[Timing] (Rank 2) Exchange : 7111 [msec]
[Timing] (Rank 2) Min-Max : 1209 [msec]
[Timing] (Rank 2) Elbow-Sort: 3163 [msec]
[Timing] (Rank 7) Total : 16 [sec]
[Timing] (Rank 7) Full-Sort : 3290 [msec]
[Timing] (Rank 7) Exchange : 6223 [msec]
[Timing] (Rank 7) Min-Max : 1668 [msec]
[Timing] (Rank 7) Elbow-Sort: 3172 [msec]
[Timing] (Rank 4) Total : 16 [sec]
[Timing] (Rank 4) Full-Sort : 3425 [msec]
[Timing] (Rank 4) Exchange : 6788 [msec]
[Timing] (Rank 4) Min-Max : 1339 [msec]
[Timing] (Rank 4) Elbow-Sort: 3159 [msec]
[Timing] (Rank 3) Total : 16 [sec]
[Timing] (Rank 3) Full-Sort : 3308 [msec]
[Timing] (Rank 3) Exchange : 6572 [msec]
[Timing] (Rank 3) Min-Max : 1545 [msec]
[Timing] (Rank 3) Elbow-Sort: 3149 [msec]
[Timing] (Rank 5) Total : 16 [sec]
[Timing] (Rank 5) Full-Sort : 3255 [msec]
[Timing] (Rank 5) Exchange : 6707 [msec]
[Timing] (Rank 5) Min-Max : 1333 [msec]
[Timing] (Rank 5) Elbow-Sort: 3202 [msec]
[Timing] (Rank 0) Total : 16 [sec]
[Timing] (Rank 0) Full-Sort : 3409 [msec]
[Timing] (Rank 0) Exchange : 8214 [msec]
[Timing] (Rank 0) Min-Max : 848 [msec]
[Timing] (Rank 0) Elbow-Sort: 3190 [msec]
Results validation ... [PASS] 
[Timing] (Rank 1) Total : 16 [sec]
[Timing] (Rank 1) Full-Sort : 3296 [msec]
[Timing] (Rank 1) Exchange : 7188 [msec]
[Timing] (Rank 1) Min-Max : 1179 [msec]
[Timing] (Rank 1) Elbow-Sort: 3202 [msec]
[Timing] (Rank 13) Total : 17 [sec]
[Timing] (Rank 13) Full-Sort : 3601 [msec]
[Timing] (Rank 13) Exchange : 5231 [msec]
[Timing] (Rank 13) Min-Max : 2524 [msec]
[Timing] (Rank 13) Elbow-Sort: 3299 [msec]
[Timing] (Rank 15) Total : 17 [sec]
[Timing] (Rank 15) Full-Sort : 3676 [msec]
[Timing] (Rank 15) Exchange : 6332 [msec]
[Timing] (Rank 15) Min-Max : 2030 [msec]
[Timing] (Rank 15) Elbow-Sort: 3259 [msec]
[Timing] (Rank 10) Total : 17 [sec]
[Timing] (Rank 10) Full-Sort : 3717 [msec]
[Timing] (Rank 10) Exchange : 7030 [msec]
[Timing] (Rank 10) Min-Max : 1612 [msec]
[Timing] (Rank 10) Elbow-Sort: 3280 [msec]
[Timing] (Rank 14) Total : 17 [sec]
[Timing] (Rank 14) Full-Sort : 3757 [msec]
[Timing] (Rank 14) Exchange : 5315 [msec]
[Timing] (Rank 14) Min-Max : 2537 [msec]
[Timing] (Rank 14) Elbow-Sort: 3240 [msec]
[Timing] (Rank 9) Total : 17 [sec]
[Timing] (Rank 9) Full-Sort : 3562 [msec]
[Timing] (Rank 9) Exchange : 5319 [msec]
[Timing] (Rank 9) Min-Max : 2452 [msec]
[Timing] (Rank 9) Elbow-Sort: 3323 [msec]
[Timing] (Rank 8) Total : 17 [sec]
[Timing] (Rank 8) Full-Sort : 3736 [msec]
[Timing] (Rank 8) Exchange : 6411 [msec]
[Timing] (Rank 8) Min-Max : 1959 [msec]
[Timing] (Rank 8) Elbow-Sort: 3253 [msec]
[Timing] (Rank 11) Total : 17 [sec]
[Timing] (Rank 11) Full-Sort : 3521 [msec]
[Timing] (Rank 11) Exchange : 6116 [msec]
[Timing] (Rank 11) Min-Max : 2118 [msec]
[Timing] (Rank 11) Elbow-Sort: 3325 [msec]
+4
View File
@@ -0,0 +1,4 @@
#! /usr/bin/env bash
awk -F: '{print $2}' | sort -n | awk 'NR==1 {print "Min:", $1, $2} END {print "Max:", $1, $2}'
+15
View File
@@ -0,0 +1,15 @@
#! /usr/bin/env bash
if [[ $# -lt 2 ]]; then
echo "Error: You must pass the directory with the scripts and partition"
echo "you want to run to "
echo "example $ enqueueAll.sh ./hpc/Q23 batch"
echo "example $ enqueueAll.sh ./hpc/Q20 rome"
exit 1;
fi
# Enqueue
for file in $(ls $1); do
echo "sbatch -p $2 --qos=small $file";
eval "sbatch -p $2 --qos=small $file";
done
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=1:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=32
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=32
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=32
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=32
#SBATCH --cpus-per-task=4
#SBATCH --time=5:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=4
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 20 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 23 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 25 --perf --validation
+28
View File
@@ -0,0 +1,28 @@
#! /usr/bin/env bash
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=8
#SBATCH --cpus-per-task=4
#SBATCH --time=2:00
# Use this as following
# $> sbatch -p batch|rome <this file>
#
# NOTE:
# First compile in aristotle with
# $> module load gcc/9.2.0 openmpi/4.0.3
# $> make -j hpc-build
#
module load gcc/9.2.0 openmpi/4.0.3
# Note:
# The above versions are matching w/ my system's
# versions, thus making compiling/debugging easier.
# Suppress unused UCX_ROOT warning
export UCX_WARN_UNUSED_ENV_VARS=n
# Suppress CUDA-aware support is disabled warning
export OMPI_MCA_opal_warn_on_missing_libcuda=0
srun ./out-rc3a/distbitonic -q 27 --perf --validation
+32 -10
View File
@@ -1,5 +1,5 @@
/*!
* \file config,h
* \file
* \brief Build configuration file.
*
* \author
@@ -10,30 +10,52 @@
#ifndef CONFIG_H_
#define CONFIG_H_
#include <iostream>
#include <string>
#include <cstdint>
/*
* Defines for different version of the exercise
*/
#define V50 (50)
#define V100 (100)
#define BITONIC (1)
#define BUBBLETONIC (2)
// Fail-safe version selection
#if !defined CODE_VERSION
#define CODE_VERSION V1
#define CODE_VERSION BITONIC
#endif
// Default Data size (in case -q <N> is not present)
#define DEFAULT_DATA_SIZE (1 << 16)
/*!
* Value type selection
*
* We support the following compiler types or the <cstdint> that translate to them:
* char - unsigned char
* short - unsigned short
* int - unsigned int
* long - unsigned long
* long long - unsigned long long
* float
* double
*/
using distValue_t = uint32_t;
/*!
* Session option for each invocation of the executable
*/
struct session_t {
bool timing {false};
bool verbose {false}; //!< Flag to enable verbose output to stdout
struct config_t {
size_t arraySize{DEFAULT_DATA_SIZE}; //!< The array size of the local data to sort.
bool validation{false}; //!< Request a full validation at the end, performed by process rank 0.
bool ndebug{false}; //!< Skips debug trap on DEBUG builds.
bool perf{false}; //!< Enable performance timing measurements and prints.
bool verbose{false}; //!< Flag to enable verbose output to stdout.
};
extern session_t session;
/*
* Exported data types
*/
extern config_t config;
#endif /* CONFIG_H_ */
+336
View File
@@ -0,0 +1,336 @@
/*!
* \file
* \brief Distributed sort implementation header
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#ifndef DISTBITONIC_H_
#define DISTBITONIC_H_
#include <vector>
#include <algorithm>
#include <parallel/algorithm>
#include <cmath>
#include <cstdint>
#if !defined DEBUG
#define NDEBUG
#endif
#include <cassert>
#include "utils.hpp"
extern Timing TfullSort, Texchange, Tminmax, TelbowSort; // make timers public
/*!
* Enumerator for the different versions of the sorting method
*/
enum class SortMode {
Bubbletonic, //!< The v0.5 of the algorithm where we use a bubble-sort like approach
Bitonic //!< The v1.0 of the algorithm where we use the bitonic data-exchange approach
};
/*
* ============================== Sort utilities ==============================
*/
/*!
* The primary function template of ascending(). It is DISABLED since , it is explicitly specialized
* for each of the \c SortMode
*/
template <SortMode Mode> inline bool ascending(mpi_id_t, [[maybe_unused]] size_t) noexcept = delete;
/*!
* Returns the ascending or descending configuration of the node's sequence based on
* the current node (MPI process) and the depth of the sorting network
*
* @param node [mpi_id_t] The current node (MPI process)
* @return [bool] True if we need ascending configuration, false otherwise
*/
template <> inline
bool ascending<SortMode::Bubbletonic>(mpi_id_t node, [[maybe_unused]] size_t depth) noexcept {
return (node % 2) == 0;
}
/*!
* Returns the ascending or descending configuration of the node's sequence based on
* the current node (MPI process) and the depth of the sorting network
*
* @param node [mpi_id_t] The current node (MPI process)
* @param depth [size_t] The total depth of the sorting network (same for each step for a given network)
* @return [bool] True if we need ascending configuration, false otherwise
*/
template <> inline
bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth) noexcept {
return !(node & (1 << depth));
}
/*!
* The primary function template of partner(). It is DISABLED since , it is explicitly specialized
* for each of the \c SortMode
*/
template <SortMode Mode> inline mpi_id_t partner(mpi_id_t, size_t) noexcept = delete;
/*!
* Returns the node's partner for data exchange during the sorting network iterations
* of Bubbletonic
*
* @param node [mpi_id_t] The current node
* @param step [size_t] The step of the sorting network
* @return [mpi_id_t] The node id of the partner for data exchange
*/
template <> inline
mpi_id_t partner<SortMode::Bubbletonic>(mpi_id_t node, size_t step) noexcept {
//return (node % 2 == step % 2) ? node + 1 : node - 1;
return (((node+step) % 2) == 0) ? node + 1 : node - 1;
}
/*!
* Returns the node's partner for data exchange during the sorting network iterations
* of Bitonic
*
* @param node [mpi_id_t] The current node
* @param step [size_t] The step of the sorting network
* @return [mpi_id_t] The node id of the partner for data exchange
*/
template <> inline
mpi_id_t partner<SortMode::Bitonic>(mpi_id_t node, size_t step) noexcept {
return (node ^ (1 << step));
}
/*!
* The primary function template of keepSmall(). It is DISABLED since , it is explicitly specialized
* for each of the \c SortMode
*/
template<SortMode Mode> inline bool keepSmall(mpi_id_t, mpi_id_t, [[maybe_unused]] size_t) = delete;
/*!
* Predicate to check if a node keeps the small numbers during the bubbletonic sort network exchange.
*
* @param node [mpi_id_t] The node for which we check
* @param partner [mpi_id_t] The partner of the data exchange
* @return [bool] True if the node should keep the small values, false otherwise
*/
template <> inline
bool keepSmall<SortMode::Bubbletonic>(mpi_id_t node, mpi_id_t partner, [[maybe_unused]] size_t depth) {
if (node == partner)
throw std::runtime_error("(keepSmall) Node and Partner can not be the same\n");
return (node < partner);
}
/*!
* Predicate to check if a node keeps the small numbers during the bitonic sort network exchange.
*
* @param node [mpi_id_t] The node for which we check
* @param partner [mpi_id_t] The partner of the data exchange
* @param depth [size_t] The total depth of the sorting network (same for each step for a given network)
* @return [bool] True if the node should keep the small values, false otherwise
*/
template <> inline
bool keepSmall<SortMode::Bitonic>(mpi_id_t node, mpi_id_t partner, size_t depth) {
if (node == partner)
throw std::runtime_error("(keepSmall) Node and Partner can not be the same\n");
return ascending<SortMode::Bitonic>(node, depth) == (node < partner);
}
/*!
* Predicate to check if the node is active in the current iteration of the bubbletonic
* sort exchange.
*
* @param node [mpi_id_t] The node to check
* @param nodes [size_t] The total number of nodes
* @return [bool] True if the node is active, false otherwise
*/
bool isActive(mpi_id_t node, size_t nodes);
/*
* ============================== Data utilities ==============================
*/
/*!
* Sort a range using the build-in O(Nlog(N)) algorithm
*
* @tparam RangeT A range type with random access iterator
*
* @param data [RangeT] The data to be sorted
* @param ascending [bool] Flag to indicate the sorting order
*/
template<typename RangeT>
void fullSort(RangeT& data, bool ascending) noexcept {
// Use introsort from stdlib++ here, unless ... __gnu_parallel
if (ascending) {
__gnu_parallel::sort(data.begin(), data.end(), std::less<>());
}
else {
__gnu_parallel::sort(data.begin(), data.end(), std::greater<>());
}
}
/*!
* Core functionality of sort for shadowed buffer types using
* the "elbow sort" algorithm.
*
* @note:
* This algorithm can not work "in place".
* We use the active buffer as source and the shadow as target.
* At the end we switch which buffer is active and which is the shadow.
* @note
* This is the core functionality. Use the elbowSort() function instead
*
* @tparam ShadowedDataT A Shadowed buffer type with random access iterator.
* @tparam CompT A Comparison type for binary operation comparisons
*
* @param data [ShadowedDataT] The data to sort
* @param ascending [bool] Flag to indicate the sorting order
* @param comp [CompT] The binary operator object
*/
template<typename ShadowedDataT, typename CompT>
void elbowSortCore(ShadowedDataT& data, bool ascending, CompT comp) noexcept {
auto& active = data.getActive(); // Get the source vector (the data to sort)
auto& shadow = data.getShadow(); // Get the target vector (the sorted data)
size_t N = data.size(); // The total size is the same or both vectors
size_t left = std::distance(
active.begin(),
(ascending) ?
std::min_element(active.begin(), active.end()) :
std::max_element(active.begin(), active.end())
); // start 'left' from elbow of the bitonic
size_t right = (left == N-1) ? 0 : left + 1;
// Walk in opposite directions from elbow and insert-sort to target vector
for (size_t i = 0 ; i<N ; ++i) {
if (comp(active[left], active[right])) {
shadow[i] = active[left];
left = (left == 0) ? N-1 : left -1; // cycle decrease
}
else {
shadow[i] = active[right];
right = (right + 1) % N; // cycle increase
}
}
data.switch_active(); // Switch active-shadow buffers
}
/*!
* Sort a shadowed buffer using the "elbow sort" algorithm.
*
* @tparam ShadowedDataT A Shadowed buffer type with random access iterator.
*
* @param data [ShadowedDataT] The data to sort
* @param ascending [bool] Flag to indicate the sorting order
*/
template<typename ShadowedDataT>
void elbowSort(ShadowedDataT& data, bool ascending) noexcept {
if (ascending)
elbowSortCore(data, ascending, std::less<>());
else
elbowSortCore(data, ascending, std::greater<>());
}
/*!
* Takes two sorted sequences where one is in increasing and the other is in decreasing order
* and selects either the larger or the smaller items in one-to-one comparison between them.
* The result is a bitonic sequence.
*
* @tparam RangeT A range type with random access iterator
*
* @param local [RangeT] Reference to the local sequence
* @param remote [const RangeT] Reference to the remote sequence (copied locally by MPI)
* @param keepSmall [bool] Flag to indicate if we keep the small items in local sequence
*/
template<typename RangeT>
void keepMinOrMax(RangeT& local, const RangeT& remote, bool keepSmall) noexcept {
using value_t = typename RangeT::value_type;
std::transform(
local.begin(), local.end(),
remote.begin(),
local.begin(),
[&keepSmall](const value_t& a, const value_t& b){
return (keepSmall) ? std::min(a, b) : std::max(a, b);
});
}
/*
* ============================== Sort algorithms ==============================
*/
/*!
* A distributed version of the Bubbletonic sort algorithm.
*
* @note
* Each MPI process should run an instance of this function.
*
* @tparam ShadowedDataT A Shadowed buffer type with random access iterator.
*
* @param data [ShadowedDataT] The local to MPI process data to sort
* @param Processes [mpi_id_t] The total number of MPI processes
* @param rank [mpi_id_t] The current process id
*/
template<typename ShadowedDataT>
void distBubbletonic(ShadowedDataT& data, mpi_id_t Processes, mpi_id_t rank) {
// Initially sort to create a half part of a bitonic sequence
timeCall(TfullSort, fullSort, data, ascending<SortMode::Bubbletonic>(rank, 0));
// Sort network (O(N) iterations)
for (size_t step = 0; step < static_cast<size_t>(Processes); ++step) {
// Find out exchange configuration
auto part = partner<SortMode::Bubbletonic>(rank, step);
auto ks = keepSmall<SortMode::Bubbletonic>(rank, part, Processes);
if ( isActive(rank, Processes) &&
isActive(part, Processes) ) {
// Exchange with partner, keep nim-or-max and sort - O(N)
int tag = static_cast<int>(step);
timeCall(Texchange, mpi.exchange_data, data.getActive(), data.getShadow(), part, tag);
timeCall(Tminmax, keepMinOrMax, data.getActive(), data.getShadow(), ks);
timeCall(TelbowSort, elbowSort, data, ascending<SortMode::Bubbletonic>(rank, Processes));
}
}
// Invert if the node was descending.
if (!ascending<SortMode::Bubbletonic>(rank, 0)) {
elbowSort(data, true);
}
}
/*!
* A distributed version of the Bitonic sort algorithm.
*
* @note
* Each MPI process should run an instance of this function.
*
* @tparam ShadowedDataT A Shadowed buffer type with random access iterator.
*
* @param data [ShadowedDataT] The local to MPI process data to sort
* @param Processes [mpi_id_t] The total number of MPI processes
* @param rank [mpi_id_t] The current process id
*/
template<typename ShadowedDataT>
void distBitonic(ShadowedDataT& data, mpi_id_t Processes, mpi_id_t rank) {
// Initially sort to create a half part of a bitonic sequence
timeCall(TfullSort, fullSort, data, ascending<SortMode::Bitonic>(rank, 0));
// Run through sort network using elbow-sort ( O(LogN * LogN) iterations )
auto p = static_cast<uint32_t>(std::log2(Processes));
for (size_t depth = 1; depth <= p; ++depth) {
for (size_t step = depth; step > 0;) {
--step;
// Find out exchange configuration
auto part = partner<SortMode::Bitonic>(rank, step);
auto ks = keepSmall<SortMode::Bitonic>(rank, part, depth);
// Exchange with partner, keep nim-or-max
int tag = static_cast<int>( (2*p*depth) + step );
timeCall(Texchange, mpi.exchange_data, data.getActive(), data.getShadow(), part, tag);
timeCall(Tminmax, keepMinOrMax, data.getActive(), data.getShadow(), ks);
}
// sort - O(N)
timeCall(TelbowSort, elbowSort, data, ascending<SortMode::Bitonic>(rank, depth));
}
}
#endif //DISTBITONIC_H_
-804
View File
@@ -1,804 +0,0 @@
/**
* \file matrix.hpp
* \brief A matrix abstraction implementation
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#ifndef MATRIX_HPP_
#define MATRIX_HPP_
#include <type_traits>
#include <utility>
#include <algorithm>
#include <vector>
#include <tuple>
namespace mtx {
using std::size_t;
/*
* Small helper to strip types
*/
template<typename T>
struct remove_cvref {
typedef std::remove_cv_t<std::remove_reference_t<T>> type;
};
template<typename T>
using remove_cvref_t = typename remove_cvref<T>::type;
/*!
* Enumerator to denote the storage type of the array to use.
*/
enum class MatrixType {
DENSE, /*!< Matrix is dense */
SPARSE, /*!< Matrix is sparse */
};
/*!
* Enumerator to denote the storage type of the array to use.
*/
enum class MatrixOrder {
COLMAJOR, /*!< Matrix is column major */
ROWMAJOR, /*!< Matrix is row major */
};
/*
* Forward type declarations
*/
template<typename MatrixType> struct MatCol;
template<typename MatrixType> struct MatRow;
template<typename MatrixType> struct MatVal;
/*!
* A 2-D matrix functionality over a 1-D array
*
* This is a very thin abstraction layer over a native array.
* This is tested using compiler explorer and our template produce
* almost identical assembly.
*
* The penalty hit we have is due to the fact that we use a one dimension array
* and we have to calculate the actual position from an (i,j) pair.
* The use of 1D array was our intention from the beginning, so the penalty
* was pretty much unavoidable.
*
* \tparam DataType The underling data type of the array
* \tparam IndexType The underling type for the index variables and sizes
* \tparam Type The storage type of the array
* \arg FULL For full matrix
* \arg SYMMETRIC For symmetric matrix (we use only the lower part)
*/
template<typename DataType,
typename IndexType = size_t,
MatrixType Type = MatrixType::DENSE,
MatrixOrder Order = MatrixOrder::ROWMAJOR,
bool Symmetric = false>
struct Matrix {
using dataType = DataType; //!< meta:export of underling data type
using indexType = IndexType; //!< meta:export of underling index type
static constexpr MatrixOrder matrixOrder = Order; //!< meta:export of array order
static constexpr MatrixType matrixType = Type; //!< meta:export of array type
static constexpr bool symmetric = Symmetric; //!< meta:export symmetric flag
/*!
* \name Obj lifetime
*/
//! @{
//! Construct an empty matrix with dimensions rows x columns
Matrix(IndexType rows = IndexType{}, IndexType columns = IndexType{}) noexcept
: vector_storage_(capacity(rows, columns)),
raw_storage_(nullptr),
use_vector_(true),
rows_(rows),
cols_(columns) {
data_ = vector_storage_.data();
}
//! Construct a matrix by copying existing data with dimensions rows x columns
Matrix(DataType* data, IndexType major_start, IndexType major_length, IndexType minor_length) noexcept
: vector_storage_(),
raw_storage_ (data + major_start * minor_length),
use_vector_ (false) {
if constexpr (Order == MatrixOrder::ROWMAJOR) {
rows_ = major_length;
cols_ = minor_length;
}
else {
rows_ = minor_length;
cols_ = major_length;
}
data_ = raw_storage_;
}
//! Construct a matrix using an initializer list
Matrix(IndexType rows, IndexType columns, std::initializer_list<DataType> list)
: vector_storage_(list),
raw_storage_(nullptr),
use_vector_(true),
rows_(rows),
cols_(columns) {
if (list.size() != capacity(rows, columns)) {
throw std::invalid_argument("Matrix initializer list size does not match matrix dimensions.");
}
data_ = vector_storage_.data();
}
//! move ctor
Matrix(Matrix&& m) noexcept { moves(std::move(m)); }
//! move
Matrix& operator=(Matrix&& m) noexcept { moves(std::move(m)); return *this; }
Matrix(const Matrix& m) = delete; //!< No copy ctor
Matrix& operator=(const Matrix& m) = delete; //!< No copy
//Matrix(const Matrix& m);
//Matrix& operator=(const Matrix& m) { copy(m); }
//! @}
//! \name Data exposure
//! @{
//! Get/Set the size of each dimension
IndexType rows() const noexcept { return rows_; }
IndexType columns() const noexcept { return cols_; }
//! Get the interface size of the Matrix (what appears to be the size)
IndexType size() const {
return rows_ * cols_;
}
//! Set the interface size of the Matrix (what appears to be the size)
IndexType resize(IndexType rows, IndexType columns) {
if (use_vector_) {
rows_ = rows;
cols_ = columns;
vector_storage_.resize(capacity(rows_, cols_));
data_ = vector_storage_.data();
}
return capacity(rows_, cols_);
}
//! Actual memory capacity of the symmetric matrix
static constexpr IndexType capacity(IndexType M, IndexType N) {
if constexpr (Symmetric)
return (M+1)*N/2;
else
return M*N;
}
/*
* virtual 2D accessors
*/
DataType get (IndexType i, IndexType j) {
if constexpr (Symmetric) {
auto T = [](size_t i)->size_t { return i*(i+1)/2; }; // Triangular number of i
if constexpr (Order == MatrixOrder::COLMAJOR) {
// In column major we use the lower triangle of the matrix
if (i>=j) return data_[j*rows_ - T(j) + i]; // Lower, use our notation
else return data_[i*rows_ - T(i) + j]; // Upper, use opposite index
}
else {
// In row major we use the upper triangle of the matrix
if (i<=j) return data_[i*cols_ - T(i) + j]; // Upper, use our notation
else return data_[j*cols_ - T(j) + i]; // Lower, use opposite index
}
}
else {
if constexpr (Order == MatrixOrder::COLMAJOR)
return data_[i + j*rows_];
else
return data_[i*cols_ + j];
}
}
/*!
* \fn DataType set(DataType, IndexType, IndexType)
* \param v
* \param i
* \param j
* \return
*/
DataType set (DataType v, IndexType i, IndexType j) {
if constexpr (Symmetric) {
auto T = [](size_t i)->size_t { return i*(i+1)/2; }; // Triangular number of i
if constexpr (Order == MatrixOrder::COLMAJOR) {
// In column major we use the lower triangle of the matrix
if (i>=j) return data_[j*rows_ - T(j) + i] = v; // Lower, use our notation
else return data_[i*rows_ - T(i) + j] = v; // Upper, use opposite index
}
else {
// In row major we use the upper triangle of the matrix
if (i<=j) return data_[i*cols_ - T(i) + j] = v; // Upper, use our notation
else return data_[j*cols_ - T(j) + i] = v; // Lower, use opposite index
}
}
else {
if constexpr (Order == MatrixOrder::COLMAJOR)
return data_[i + j*rows_] = v;
else
return data_[i*cols_ + j] = v;
}
}
// DataType operator()(IndexType i, IndexType j) { return get(i, j); }
/*!
* Return a proxy MatVal object with read and write capabilities.
* @param i The row number
* @param j The column number
* @return tHE MatVal object
*/
MatVal<Matrix> operator()(IndexType i, IndexType j) noexcept {
return MatVal<Matrix>(this, get(i, j), i, j);
}
// a basic serial iterator support
DataType* data() noexcept { return data_; }
DataType* begin() noexcept { return data_; }
const DataType* begin() const noexcept { return data_; }
DataType* end() noexcept { return data_ + capacity(rows_, cols_); }
const DataType* end() const noexcept { return data_ + capacity(rows_, cols_); }
// IndexType begin_idx() noexcept { return 0; }
// IndexType end_idx() noexcept { return capacity(rows_, cols_); }
const DataType* data() const noexcept { return data_; }
const IndexType begin_idx() const noexcept { return 0; }
const IndexType end_idx() const noexcept { return capacity(rows_, cols_); }
//! @}
/*!
* \name Safe iteration API
*
* This api automates the iteration over the array based on
* MatrixType
*/
//! @{
template<typename F, typename... Args>
void for_each_in (IndexType begin, IndexType end, F&& lambda, Args&&... args) {
for (IndexType it=begin ; it<end ; ++it) {
std::forward<F>(lambda)(std::forward<Args>(args)..., it);
}
}
//! @}
//
void swap(Matrix& src) noexcept {
std::swap(vector_storage_, src.vector_storage_);
std::swap(raw_storage_, src.raw_storage_);
std::swap(data_, src.data_);
std::swap(use_vector_, src.use_vector_);
std::swap(rows_, src.rows_);
std::swap(cols_, src.cols_);
}
private:
//! move helper
void moves(Matrix&& src) noexcept {
vector_storage_ = std::move(src.vector_storage_);
raw_storage_ = std::move(src.raw_storage_);
data_ = std::move(src.data_);
use_vector_ = std::move(src.use_vector_);
rows_ = std::move(src.rows_);
cols_ = std::move(src.cols_);
}
// Storage
std::vector<DataType>
vector_storage_; //!< Internal storage (if used).
DataType* raw_storage_; //!< External storage (if used).
DataType* data_; //!< Pointer to active storage.
bool use_vector_; //!< True if using vector storage, false for raw pointer.
IndexType rows_{}; //!< the virtual size of rows.
IndexType cols_{}; //!< the virtual size of columns.
};
/**
* A simple sparse matrix specialization.
*
* We use CSC format and provide get/set functionalities for each (i,j) item
* on the matrix. We also provide a () overload using a proxy MatVal object.
* This way the user can:
* \code
* auto v = A(3,4);
* A(3, 4) = 7;
* \endcode
*
* We also provide getCol() and getRow() functions witch return a viewer/iterator to rows and
* columns of the matrix. In the case of a symmetric matrix instead of a row we return the
* equivalent column. This way we gain speed due to CSC format nature.
*
* @tparam DataType The type for values
* @tparam IndexType The type for indexes
* @tparam Type The Matrix type (FULL or SYMMETRIC)
*/
template<typename DataType, typename IndexType,
MatrixOrder Order,
bool Symmetric>
struct Matrix<DataType, IndexType, MatrixType::SPARSE, Order, Symmetric> {
using dataType = DataType; //!< meta:export of underling data type
using indexType = IndexType; //!< meta:export of underling index type
static constexpr MatrixOrder matrixOrder = Order; //!< meta:export of array order
static constexpr MatrixType matrixType = MatrixType::SPARSE; //!< meta:export of array type
static constexpr bool symmetric = Symmetric; //!< meta:export symmetric flag
friend struct MatCol<Matrix>;
friend struct MatRow<Matrix>;
friend struct MatVal<Matrix>;
/*!
* \name Obj lifetime
*/
//! @{
//! Default ctor with optional memory allocations
Matrix(IndexType n=IndexType{}) noexcept:
values{},
rows{},
col_ptr((n)? n+1:2, IndexType{}),
N(n),
NNZ(0) { }
//! A ctor using csc array data
Matrix(IndexType n, IndexType nnz, const IndexType* row, const IndexType* col) noexcept:
values(nnz, 1),
rows(row, row+nnz),
col_ptr(col, col+n+1),
N(n),
NNZ(nnz) { }
//! ctor using csc array data with value array
Matrix(IndexType n, IndexType nnz, const DataType* v, const IndexType* row, const IndexType* col) noexcept:
values(v, v+nnz),
rows(row, row+nnz),
col_ptr(col, col+n+1),
N(n),
NNZ(nnz) { }
//! ctor vectors of row/col and default value for values array
Matrix(IndexType n, IndexType nnz, const DataType v,
const std::vector<IndexType>& row, const std::vector<IndexType>& col) noexcept:
values(nnz, v),
rows (row),
col_ptr(col),
N(n),
NNZ(nnz) { }
//! move ctor
Matrix(Matrix&& m) noexcept { moves(std::move(m)); }
//! move
Matrix& operator=(Matrix&& m) noexcept { moves(std::move(m)); return *this; }
Matrix(const Matrix& m) = delete; //!< make sure there are no copies
Matrix& operator=(const Matrix& m) = delete; //!< make sure there are no copies
//! @}
//! \name Data exposure
//! @{
//! \return the dimension of the matrix
IndexType size() noexcept { return N; }
//! After construction size configuration tool
IndexType resize(IndexType n) {
col_ptr.resize(n+1);
return N = n;
}
//! \return the NNZ of the matrix
IndexType capacity() noexcept { return NNZ; }
//! After construction NNZ size configuration tool
IndexType capacity(IndexType nnz) noexcept {
values.reserve(nnz);
rows.reserve(nnz);
return NNZ;
}
// getters for row arrays of the struct (unused)
std::vector<DataType>& getValues() noexcept { return values; }
std::vector<IndexType>& getRows() noexcept { return rows; }
std::vector<IndexType>& getCols() noexcept { return col_ptr; }
/*!
* Return a proxy MatVal object with read and write capabilities.
* @param i The row number
* @param j The column number
* @return tHE MatVal object
*/
MatVal<Matrix> operator()(IndexType i, IndexType j) noexcept {
return MatVal<Matrix>(this, get(i, j), i, j);
}
/*!
* A read item functionality using binary search to find the correct row
*
* @param i The row number
* @param j The column number
* @return The value of the item or DataType{} if is not present.
*/
DataType get(IndexType i, IndexType j) noexcept {
IndexType idx; bool found;
std::tie(idx, found) =find_idx(rows, col_ptr[j], col_ptr[j+1], i);
return (found) ? values[idx] : 0;
}
/*!
* A write item functionality.
*
* First we search if the matrix has already a value in (i, j) position.
* If so we just change it to a new value. If not we add the item on the matrix.
*
* @note
* When change a value, we don't increase the NNZ value of the struct. We expect the user has already
* change the NNZ value to the right one using @see capacity() function. When adding a value we
* increase the NNZ.
*
* @param i The row number
* @param j The column number
* @return The new value of the item .
*/
DataType set(DataType v, IndexType i, IndexType j) {
IndexType idx; bool found;
std::tie(idx, found) = find_idx(rows, col_ptr[j], col_ptr[j+1], i);
if (found)
return values[idx] = v; // we don't change NNZ even if we write "0"
else {
values.insert(values.begin()+idx, v);
rows.insert(rows.begin()+idx, i);
std::transform(col_ptr.begin()+j+1, col_ptr.end(), col_ptr.begin()+j+1, [](IndexType it) {
return ++it;
});
++NNZ; // we increase the NNZ even if we write "0"
return v;
}
}
/*!
* Get a view of a CSC column
* @param j The column to get
* @return The MatCol object @see MatCol
*/
MatCol<Matrix> getCol(IndexType j) noexcept {
return MatCol<Matrix>(this, col_ptr[j], col_ptr[j+1]);
}
/*!
* Get a view of a CSC row
*
* In case of a SYMMETRIC matrix we can return a column instead.
*
* @param j The row to get
* @return On symmetric matrix MatCol otherwise a MatRow
*/
MatCol<Matrix> getRow(IndexType i) noexcept {
if constexpr (Symmetric)
return getCol(i);
else
return MatRow<Matrix>(this, i);
}
// values only iterator support
DataType* begin() noexcept { return values.begin(); }
DataType* end() noexcept { return values.end(); }
//! @}
//! A small iteration helper
template<typename F, typename... Args>
void for_each_in (IndexType begin, IndexType end, F&& lambda, Args&&... args) {
for (IndexType it=begin ; it<end ; ++it) {
std::forward<F>(lambda)(std::forward<Args>(args)..., it);
}
}
private:
/*!
* A small binary search implementation using index for begin-end instead of iterators.
*
* \param v Reference to vector to search
* \param begin The vector's index to begin
* \param end The vector's index to end
* \param match What to search
* \return An <index, status> pair.
* index is the index of the item or end if not found
* status is true if found, false otherwise
*/
std::pair<IndexType, bool> find_idx(const std::vector<IndexType>& v, IndexType begin, IndexType end, IndexType match) {
if (v.capacity() != 0 && begin < end) {
IndexType b = begin, e = end-1;
while (b <= e) {
IndexType m = (b+e)/2;
if (v[m] == match) return std::make_pair(m, true);
else if (b >= e) return std::make_pair(end, false);
else {
if (v[m] < match) b = m +1;
else e = m -1;
}
}
}
return std::make_pair(end, false);
}
// move helper
void moves(Matrix&& src) noexcept {
values = std::move(src.values);
rows = std::move(src.rows);
col_ptr = std::move(src.col_ptr);
N = std::move(src.N); // redundant for primitives
NNZ = std::move(src.NNZ); //
}
//! \name Data
//! @{
std::vector<DataType> values {}; //!< vector to store the values of the matrix
std::vector<IndexType> rows{}; //!< vector to store the row information
std::vector<IndexType> col_ptr{1,0}; //!< vector to store the column pointers
IndexType N{0}; //!< The dimension of the matrix (square)
IndexType NNZ{0}; //!< The NNZ (capacity of the matrix)
//! @}
};
/*!
* A view/iterator hybrid object for Matrix columns.
*
* This object provides access to a column of a Matrix. The public functionalities
* allow data access using indexes instead of iterators. We prefer indexes over iterators
* because we can apply the same index to different inner vector of Matrix without conversion.
*
* @tparam DataType
* @tparam IndexType
*/
template<typename MatrixType>
struct MatCol {
using owner_t = MatrixType;
using DataType = typename MatrixType::dataType;
using IndexType = typename MatrixType::indexType;
/*!
* ctor using column pointers for begin-end. own is pointer to Matrix.
*/
MatCol(owner_t* own, const IndexType begin, const IndexType end) noexcept :
owner_(own), index_(begin), begin_(begin), end_(end) {
vindex_ = vIndexCalc(index_);
}
MatCol() = default;
MatCol(const MatCol&) = delete; //!< make sure there are no copies
MatCol& operator=(const MatCol&)= delete; //!< make sure there are no copies
MatCol(MatCol&&) = default;
MatCol& operator=(MatCol&&) = default;
//! a simple dereference operator, like an iterator
DataType operator* () {
return get();
}
//! Increment operator acts on index(), like an iterator
MatCol& operator++ () { advance(); return *this; }
MatCol& operator++ (int) { MatCol& p = *this; advance(); return p; }
//! () operator acts as member access (like a view)
DataType operator()(IndexType x) {
return (x == index())? get() : DataType{};
}
//! = operator acts as member assignment (like a view)
DataType operator= (DataType v) { return owner_->values[index_] = v; }
// iterator like handlers
// these return a virtual index value based on the items position on the full matrix
// but the move of the index is just a ++ away.
IndexType index() noexcept { return vindex_; }
const IndexType index() const noexcept { return vindex_; }
IndexType begin() noexcept { return vIndexCalc(begin_); }
const IndexType begin() const noexcept { return vIndexCalc(begin_); }
IndexType end() noexcept { return owner_->N; }
const IndexType end() const noexcept { return owner_->N; }
/*!
* Multiplication operator
*
* We follow only the non-zero values and multiply only the common indexes.
*
* @tparam C Universal reference for the type right half site column
*
* @param c The right hand site matrix
* @return The value of the inner product of two vectors
* @note The time complexity is \$ O(nnz1+nnz2) \$.
* Where the nnz is the max NNZ elements of the column of the matrix
*/
template <typename C>
DataType operator* (C&& c) {
static_assert(std::is_same<remove_cvref_t<C>, MatCol<MatrixType>>(), "");
DataType v{};
while (index() != end() && c.index() != c.end()) {
if (index() < c.index()) advance(); // advance me
else if (index() > c.index()) ++c; // advance other
else { //index() == c.index()
v += get() * *c; // multiply and advance both
++c;
advance();
}
}
return v;
}
private:
//! small tool to increase the index pointers to Matrix
void advance() noexcept {
++index_;
vindex_ = vIndexCalc(index_);
}
//! tool to translate between col_ptr indexes and Matrix "virtual" full matrix indexes
IndexType vIndexCalc(IndexType idx) {
return (idx < end_) ? owner_->rows[idx] : end();
}
//! small get tool
DataType get() { return owner_->values[index_]; }
owner_t* owner_ {nullptr}; //!< Pointer to owner Matrix. MatCol is just a view
IndexType vindex_ {IndexType{}}; //!< Virtual index of full matrix
IndexType index_ {IndexType{}}; //!< index to Matrix::rows
IndexType begin_ {IndexType{}}; //!< beginning index of the column in Matrix::rows
IndexType end_ {IndexType{}}; //!< ending index of the column in Matrix::rows
};
/*!
* A view/iterator hybrid object for Matrix rows.
*
* This object provides access to a column of a Matrix. The public functionalities
* allow data access using indexes instead of iterators. We prefer indexes over iterators
* because we can apply the same index to different inner vector of Matrix without conversion.
*
* @tparam DataType
* @tparam IndexType
*/
template<typename MatrixType>
struct MatRow {
using owner_t = MatrixType;
using DataType = typename MatrixType::dataType;
using IndexType = typename MatrixType::indexType;
/*!
* ctor using virtual full matrix row index. own is pointer to Matrix.
*/
MatRow(owner_t* own, const IndexType row) noexcept :
owner_(own), vindex_(IndexType{}), row_(row), index_(IndexType{}),
begin_(IndexType{}), end_(owner_->NNZ) {
// place begin
while(begin_ != end_ && owner_->rows[begin_] != row_)
++begin_;
// place index_ and vindex_
if (owner_->rows[index_] != row_)
advance();
}
MatRow() = default;
MatRow(const MatRow&) = delete; //!< make sure there are no copies
MatRow& operator=(const MatRow&)= delete; //!< make sure there are no copies
MatRow(MatRow&&) = default;
MatRow& operator=(MatRow&&) = default;
//! a simple dereference operator, like an iterator
DataType operator* () {
return get();
}
//! Increment operator acts on index(), like an iterator
//! here the increment is a O(N) process.
MatRow& operator++ () { advance(); return *this; }
MatRow& operator++ (int) { MatRow& p = *this; advance(); return p; }
//! () operator acts as member access (like a view)
DataType operator()(IndexType x) {
return (x == index())? get() : DataType{};
}
//! = operator acts as member assignment (like a view)
DataType operator= (DataType v) { return owner_->values[index_] = v; }
// iterator like handlers
// these return a virtual index value based on the items position on the full matrix
// but the move of the index is just a ++ away.
IndexType index() noexcept { return vindex_; }
const IndexType index() const noexcept { return vindex_; }
IndexType begin() noexcept { return vIndexCalc(begin_); }
const IndexType begin() const noexcept { return vIndexCalc(begin_); }
IndexType end() noexcept { return owner_->N; }
const IndexType end() const noexcept { return owner_->N; }
/*!
* Multiplication operator
*
* We follow only the non-zero values and multiply only the common indexes.
*
* @tparam C Universal reference for the type right half site column
*
* @param c The right hand site matrix
* @return The value of the inner product of two vectors
* @note The time complexity is \$ O(N+nnz2) \$ and way heavier the ColxCol multiplication.
* Where the nnz is the max NNZ elements of the column of the matrix
*/
template <typename C>
DataType operator* (C&& c) {
static_assert(std::is_same<remove_cvref_t<C>, MatCol<MatrixType>>(), "");
DataType v{};
while (index() != end() && c.index() != c.end()) {
if (index() < c.index()) advance(); // advance me
else if (index() > c.index()) ++c; // advance other
else { //index() == c.index()
v += get() * *c; // multiply and advance both
++c;
advance();
}
}
return v;
}
private:
//! small tool to increase the index pointers to Matrix matrix
//! We have to search the entire rows vector in Matrix to find the next
//! virtual row position.
//! time complexity O(N)
void advance() noexcept {
do
++index_;
while(index_ != end_ && owner_->rows[index_] != row_);
vindex_ = vIndexCalc(index_);
}
//! tool to translate between col_ptr indexes and Matrix "virtual" full matrix indexes
IndexType vIndexCalc(IndexType idx) {
for(IndexType i =0 ; i<(owner_->N+1) ; ++i)
if (idx < owner_->col_ptr[i])
return i-1;
return end();
}
//! small get tool
DataType get() { return owner_->values[index_]; }
owner_t* owner_ {nullptr}; //!< Pointer to owner Matrix. MatCol is just a view
IndexType vindex_ {IndexType{}}; //!< Virtual index of full matrix
IndexType row_ {IndexType{}}; //!< The virtual full matrix row of the object
IndexType index_ {IndexType{}}; //!< index to Matrix::rows
IndexType begin_ {IndexType{}}; //!< beginning index of the column in Matrix::rows
IndexType end_ {IndexType{}}; //!< ending index of the column in Matrix::rows
};
/*!
* A proxy Matrix value object/view.
*
* This object acts as proxy to provide read/write access to an Matrix item.
*
* @tparam DataType The type of the values of the Matrix matrix
* @tparam IndexType The type of the indexes of the Matrix matrix
*/
template<typename MatrixType>
struct MatVal {
using owner_t = MatrixType;
using DataType = typename MatrixType::dataType;
using IndexType = typename MatrixType::indexType;
//!< ctor using all value-row-column data, plus a pointer to owner Matrix object
MatVal(owner_t* own, DataType v, IndexType i, IndexType j) :
owner_(own), v_(v), i_(i), j_(j) { }
MatVal() = default;
MatVal(const MatVal&) = delete; //!< make sure there are no copies
MatVal& operator=(const MatVal&) = delete; //!< make sure there are no copies
MatVal(MatVal&&) = default;
MatVal& operator=(MatVal&&) = default;
//! Operator to return the DataType value implicitly
operator DataType() { return v_; }
//! Operator to write back to owner the assigned value
//! for ex: A(2,3) = 5;
MatVal& operator=(DataType v) {
v_ = v;
owner_->set(v_, i_, j_);
return *this;
}
private:
owner_t* owner_{nullptr}; //!< Pointer to owner Matrix. MatVal is just a view.
DataType v_{DataType{}}; //!< The value of the row-column pair (for speed)
IndexType i_{IndexType{}}; //!< The row
IndexType j_{IndexType{}}; //!< the column
};
} // namespace mtx
#endif /* MATRIX_HPP_ */
+345 -27
View File
@@ -1,5 +1,5 @@
/**
* \file utils.hpp
* \file
* \brief Utilities header
*
* \author
@@ -9,13 +9,306 @@
#ifndef UTILS_HPP_
#define UTILS_HPP_
#include <vector>
#include <iostream>
#include <chrono>
#include <unistd.h>
#include <mpi.h>
#include "matrix.hpp"
#include "config.h"
/*
* MPI_<type> dispatcher mechanism
*/
template <typename T> struct MPI_TypeMapper { };
template <> struct MPI_TypeMapper<char> { static MPI_Datatype getType() { return MPI_CHAR; } };
template <> struct MPI_TypeMapper<short> { static MPI_Datatype getType() { return MPI_SHORT; } };
template <> struct MPI_TypeMapper<int> { static MPI_Datatype getType() { return MPI_INT; } };
template <> struct MPI_TypeMapper<long> { static MPI_Datatype getType() { return MPI_LONG; } };
template <> struct MPI_TypeMapper<long long> { static MPI_Datatype getType() { return MPI_LONG_LONG; } };
template <> struct MPI_TypeMapper<unsigned char> { static MPI_Datatype getType() { return MPI_UNSIGNED_CHAR; } };
template <> struct MPI_TypeMapper<unsigned short>{ static MPI_Datatype getType() { return MPI_UNSIGNED_SHORT; } };
template <> struct MPI_TypeMapper<unsigned int> { static MPI_Datatype getType() { return MPI_UNSIGNED; } };
template <> struct MPI_TypeMapper<unsigned long> { static MPI_Datatype getType() { return MPI_UNSIGNED_LONG; } };
template <> struct MPI_TypeMapper<unsigned long long> { static MPI_Datatype getType() { return MPI_UNSIGNED_LONG_LONG; } };
template <> struct MPI_TypeMapper<float> { static MPI_Datatype getType() { return MPI_FLOAT; } };
template <> struct MPI_TypeMapper<double> { static MPI_Datatype getType() { return MPI_DOUBLE; } };
/*!
* MPI wrapper type to provide MPI functionality and RAII to MPI as a resource
*
* @tparam TID The MPI type for process id [default: int]
*/
template<typename TID = int>
struct MPI_t {
using ID_t = TID; // Export TID type (currently int defined by the standard)
/*!
* Initializes the MPI environment, must called from each process
*
* @param argc [int*] POINTER to main's argc argument
* @param argv [char***] POINTER to main's argv argument
*/
void init(int* argc, char*** argv) {
// Initialize the MPI environment
int err;
if ((err = MPI_Init(argc, argv)) != MPI_SUCCESS)
mpi_throw(err, "(MPI) MPI_Init() - ");
initialized_ = true;
// Get the number of processes
int size_value, rank_value;
if ((err = MPI_Comm_size(MPI_COMM_WORLD, &size_value)) != MPI_SUCCESS)
mpi_throw(err, "(MPI) MPI_Comm_size() - ");
if ((err = MPI_Comm_rank(MPI_COMM_WORLD, &rank_value)) != MPI_SUCCESS)
mpi_throw(err, "(MPI) MPI_Comm_rank() - ");
size_ = static_cast<ID_t>(size_value);
rank_ = static_cast<ID_t>(rank_value);
// Get the name of the processor
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
if ((err = MPI_Get_processor_name(processor_name, &name_len)) != MPI_SUCCESS)
mpi_throw(err, "(MPI) MPI_Get_processor_name() - ");
name_ = std::string (processor_name, name_len);
}
/*!
* Exchange data with partner as part of the sorting network of both bubbletonic or bitonic
* sorting algorithms.
*
* This function matches a transmit and a receive in order for fully exchanged data between
* current node and partner.
*
* @tparam T The inner valur type used in buffer
*
* @param ldata [std::vector<T>] Reference to local data to send
* @param rdata [std::vector<T>] Reference to buffer to receive data from partner
* @param partner [mpi_id_t] The partner for the exchange
* @param tag [int] The tag to use for the MPI communication
*/
template<typename T>
void exchange_data(const std::vector<T>& ldata, std::vector<T>& rdata, ID_t partner, int tag) {
if (tag < 0)
throw std::runtime_error("(MPI) exchange_data() [tag] - Out of bound");
MPI_Datatype datatype = MPI_TypeMapper<T>::getType();
int count = static_cast<int>(ldata.size());
MPI_Status status;
int err;
if ((err = MPI_Sendrecv(
ldata.data(), count, datatype, partner, tag,
rdata.data(), count, datatype, partner, tag,
MPI_COMM_WORLD, &status
)) != MPI_SUCCESS)
mpi_throw(err, "(MPI) MPI_Sendrecv() [data] - ");
}
/*!
* Exchange a data object with partner as part of the sorting network of both bubbletonic
* or bitonic sorting algorithms.
*
* This function matches a transmit and a receive in order for fully exchanged the data object
* between current node and partner.
*
* @tparam T The object type
*
* @param local [const T&] Reference to the local object to send
* @param remote [T&] Reference to the object to receive data from partner
* @param partner [mpi_id_t] The partner for the exchange
* @param tag [int] The tag to use for the MPI communication
*/
template<typename T>
void exchange_it(const T& local, T& remote, ID_t partner, int tag) {
if (tag < 0)
throw std::runtime_error("(MPI) exchange_it() [tag] - Out of bound");
MPI_Status status;
int err;
if ((err = MPI_Sendrecv(
&local, sizeof(T), MPI_BYTE, partner, tag,
&remote, sizeof(T), MPI_BYTE, partner, tag,
MPI_COMM_WORLD, &status
)) != MPI_SUCCESS)
mpi_throw(err, "(MPI) MPI_Sendrecv() [item] - ");
}
// Accessors
[[nodiscard]] ID_t rank() const noexcept { return rank_; }
[[nodiscard]] ID_t size() const noexcept { return size_; }
[[nodiscard]] const std::string& name() const noexcept { return name_; }
// Mutators
ID_t rank(ID_t rank) noexcept { return rank_ = rank; }
ID_t size(ID_t size) noexcept { return size_ = size; }
std::string& name(const std::string& name) noexcept { return name_ = name; }
/*!
* Finalized the MPI
*/
void finalize() {
// Finalize the MPI environment
initialized_ = false;
MPI_Finalize();
}
//! RAII MPI finalization
~MPI_t() {
// Finalize the MPI environment even on unexpected errors
if (initialized_)
MPI_Finalize();
}
// Local functionality
private:
/*!
* Throw exception helper. It bundles the prefix msg with the MPI error string retrieved by
* MPI API.
*
* @param err The MPI error code
* @param prefixMsg The prefix text for the exception error message
*/
void mpi_throw(int err, const char* prefixMsg) {
char err_msg[MPI_MAX_ERROR_STRING];
int msg_len;
MPI_Error_string(err, err_msg, &msg_len);
throw std::runtime_error(prefixMsg + std::string (err_msg) + '\n');
}
private:
ID_t rank_{}; //!< MPI rank of the process
ID_t size_{}; //!< MPI total size of the execution
std::string name_{}; //!< The name of the local machine
bool initialized_{}; //!< RAII helper flag
};
/*
* Exported data types
*/
extern MPI_t<> mpi;
using mpi_id_t = MPI_t<>::ID_t;
/*!
* @brief A std::vector wrapper with 2 vectors, an active and a shadow.
*
* This type exposes the standard vector
* functionality of the active vector. The shadow can be used when we need to use the vector as mutable
* data in algorithms that can not support "in-place" editing (like elbow-sort for example)
*
* @tparam Value_t the underlying data type of the vectors
*/
template <typename Value_t>
struct ShadowedVec_t {
// STL requirements
using value_type = Value_t;
using iterator = typename std::vector<Value_t>::iterator;
using const_iterator = typename std::vector<Value_t>::const_iterator;
using size_type = typename std::vector<Value_t>::size_type;
// Default constructor
ShadowedVec_t() = default;
// Constructor from an std::vector
explicit ShadowedVec_t(const std::vector<Value_t>& vec)
: North(vec), South(), active(north) {
South.resize(North.size());
}
explicit ShadowedVec_t(std::vector<Value_t>&& vec)
: North(std::move(vec)), South(), active(north) {
South.resize(North.size());
}
// Copy assignment operator
ShadowedVec_t& operator=(const ShadowedVec_t& other) {
if (this != &other) { // Avoid self-assignment
North = other.North;
South = other.South;
active = other.active;
}
return *this;
}
// Move assignment operator
ShadowedVec_t& operator=(ShadowedVec_t&& other) noexcept {
if (this != &other) { // Avoid self-assignment
North = std::move(other.North);
South = std::move(other.South);
active = other.active;
// There is no need to zero out other since it is valid but in a non-defined state
}
return *this;
}
// Type accessors
std::vector<Value_t>& getActive() { return (active == north) ? North : South; }
std::vector<Value_t>& getShadow() { return (active == north) ? South : North; }
const std::vector<Value_t>& getActive() const { return (active == north) ? North : South; }
const std::vector<Value_t>& getShadow() const { return (active == north) ? South : North; }
// Swap vectors
void switch_active() { active = (active == north) ? south : north; }
// Dispatch vector functionality to active vector
Value_t& operator[](size_type index) { return getActive()[index]; }
const Value_t& operator[](size_type index) const { return getActive()[index]; }
Value_t& at(size_type index) { return getActive().at(index); }
const Value_t& at(size_type index) const { return getActive().at(index); }
void push_back(const Value_t& value) { getActive().push_back(value); }
void push_back(Value_t&& value) { getActive().push_back(std::move(value)); }
void pop_back() { getActive().pop_back(); }
Value_t& front() { return getActive().front(); }
Value_t& back() { return getActive().back(); }
const Value_t& front() const { return getActive().front(); }
const Value_t& back() const { return getActive().back(); }
iterator begin() { return getActive().begin(); }
const_iterator begin() const { return getActive().begin(); }
iterator end() { return getActive().end(); }
const_iterator end() const { return getActive().end(); }
size_type size() const { return getActive().size(); }
void resize(size_t new_size) {
North.resize(new_size);
South.resize(new_size);
}
void reserve(size_t new_capacity) {
North.reserve(new_capacity);
South.reserve(new_capacity);
}
[[nodiscard]] size_t capacity() const { return getActive().capacity(); }
[[nodiscard]] bool empty() const { return getActive().empty(); }
void clear() { getActive().clear(); }
void swap(std::vector<Value_t>& other) { getActive().swap(other); }
// Comparisons
bool operator== (const ShadowedVec_t& other) { return getActive() == other.getActive(); }
bool operator!= (const ShadowedVec_t& other) { return getActive() != other.getActive(); }
bool operator== (const std::vector<value_type>& other) { return getActive() == other; }
bool operator!= (const std::vector<value_type>& other) { return getActive() != other; }
private:
std::vector<Value_t> North{}; //!< Actual buffer to be used either as active or shadow
std::vector<Value_t> South{}; //!< Actual buffer to be used either as active or shadow
enum {
north, south
} active{north}; //!< Flag to select between North and South buffer
};
/*
* Exported data types
*/
using distBuffer_t = ShadowedVec_t<distValue_t>;
extern distBuffer_t Data;
/*!
* A Logger for entire program.
*/
@@ -24,27 +317,29 @@ struct Log {
//! We provide logging via << operator
template<typename T>
Log& operator<< (T&& t) {
if (session.verbose) {
Log &operator<<(T &&t) {
if (config.verbose) {
if (line_) {
std::cout << "[Log]: " << t;
line_ = false;
}
else
} else
std::cout << t;
}
return *this;
}
// overload for special end line handling
Log& operator<< (Endl e) { (void)e;
if (session.verbose) {
Log &operator<<(Endl e) {
(void) e;
if (config.verbose) {
std::cout << '\n';
line_ = true;
}
return *this;
}
private:
bool line_ {true};
bool line_{true};
};
extern Log logger;
@@ -52,36 +347,59 @@ extern Log logger;
/*!
* A small timing utility based on chrono.
*/
struct Timing{
struct Timing {
using Tpoint = std::chrono::steady_clock::time_point;
using Tduration = std::chrono::microseconds;
using microseconds = std::chrono::microseconds;
using milliseconds = std::chrono::milliseconds;
using seconds = std::chrono::seconds;
//! tool to mark the starting point
Tpoint start () noexcept { return start_ = std::chrono::steady_clock::now(); }
//! tool to mark the ending point
Tpoint stop () noexcept { return stop_ = std::chrono::steady_clock::now(); }
Tpoint start() noexcept { return mark_ = std::chrono::steady_clock::now(); }
auto dt () noexcept {
return std::chrono::duration_cast<std::chrono::microseconds>(stop_ - start_).count();
//! tool to mark the ending point
Tpoint stop() noexcept {
Tpoint now = std::chrono::steady_clock::now();
duration_ += dt(now, mark_);
return now;
}
//! tool to print the time interval
void print_dt (const char* what) noexcept {
if (session.timing) {
auto t = stop_ - start_;
if (std::chrono::duration_cast<microseconds>(t).count() < 10000)
std::cout << "[Timing]: " << what << ": " << std::to_string(std::chrono::duration_cast<microseconds>(t).count()) << " [usec]\n";
else if (std::chrono::duration_cast<milliseconds>(t).count() < 10000)
std::cout << "[Timing]: " << what << ": " << std::to_string(std::chrono::duration_cast<milliseconds>(t).count()) << " [msec]\n";
//! A duration calculation utility
static Tduration dt(Tpoint t2, Tpoint t1) noexcept {
return std::chrono::duration_cast<Tduration>(t2 - t1);
}
//! Tool to print the time interval
void print_duration(const char *what, mpi_id_t rank) noexcept {
if (std::chrono::duration_cast<microseconds>(duration_).count() < 10000)
std::cout << "[Timing] (Rank " << rank << ") " << what << ": "
<< std::to_string(std::chrono::duration_cast<microseconds>(duration_).count()) << " [usec]\n";
else if (std::chrono::duration_cast<milliseconds>(duration_).count() < 10000)
std::cout << "[Timing] (Rank " << rank << ") " << what << ": "
<< std::to_string(std::chrono::duration_cast<milliseconds>(duration_).count()) << " [msec]\n";
else
std::cout << "[Timing]: " << what << ": " << std::to_string(std::chrono::duration_cast<seconds>(t).count()) << " [sec]\n";
}
std::cout << "[Timing] (Rank " << rank << ") " << what << ": "
<< std::to_string(std::chrono::duration_cast<seconds>(duration_).count()) << " [sec]\n";
}
private:
Tpoint start_;
Tpoint stop_;
Tpoint mark_{};
Tduration duration_{};
};
/*!
* Utility "high level function"-like macro to forward a function call
* and accumulate the execution time to the corresponding timing object.
*
* @param Tim The Timing object [Needs to have methods start() and stop()]
* @param Func The function name
* @param ... The arguments to pass to function (the preprocessor way)
*/
#define timeCall(Tim, Func, ...) \
Tim.start(); \
Func(__VA_ARGS__); \
Tim.stop(); \
#endif /* UTILS_HPP_ */
+1 -1
View File
@@ -50,7 +50,7 @@ function distbubletonic!(p, data)
for i in 1:p
sort!(view(data, i, :), rev = !ascending[i])
end
for step in 0:p-2
for step in 0:p-1
direction = [true for x = 1:p]
partnerid = partner.(pid, step)
activeids = active.(partnerid, p)
+90 -3
View File
@@ -4,9 +4,9 @@
#
function exchange(localid, remoteid)
if verbose
println("Exchange local data from $localid with partner $remoteid")
end
# if verbose
# println("Exchange local data from $localid with partner $remoteid")
# end
nothing # We have all data here ;)
end
@@ -23,9 +23,89 @@ function minmax(data, localid, remoteid, keepsmall)
end
function is_bitonic(arr)
n = length(arr)
if n <= 2
return true # Any sequence of length <= 2 is bitonic
end
# State for state machine. 1: inc, -1: dec, 0: z-state
state = 0
inc_count = 0
dec_count = 0
ret = false
for i in 1:n-1
# Find the first order
if state == 0
if arr[i] > arr[i+1]
state = -1
dec_count += 1
elseif arr[i] < arr[i+1]
state = 1
inc_count += 1
end
elseif state == -1 # decreasing
if arr[i] < arr[i + 1]
state = 1
inc_count += 1
end
elseif state == 1 # increasing
if arr[i] > arr[i+1]
state = -1
dec_count += 1
end
end
end
if inc_count <= 1 && dec_count <= 1
ret = true # Sequence is bitonic
elseif inc_count == 2 && dec_count == 1
ret = (arr[1] >= arr[n])
elseif inc_count == 1 && dec_count == 2
ret = (arr[1] <= arr[n])
end
ret
end
function is_sort(arr)
# State for state machine. 1: inc, -1: dec, 0: z-state
state = 0
inc_count = 0
dec_count = 0
for i in 1:length(arr)-1
# Find the first order
if state == 0
if arr[i] > arr[i+1]
state = -1
dec_count += 1
elseif arr[i] < arr[i+1]
state = 1
inc_count += 1
end
elseif state == -1 # decreasing
if arr[i] < arr[i + 1]
state = 1
inc_count += 1
end
elseif state == 1 # increasing
if arr[i] > arr[i+1]
state = -1
dec_count += 1
end
end
end
ret = ((inc_count + dec_count) == 1) ? state : 0
ret
end
function sort_network!(data, n, depth)
nodes = 0:n-1
bitonicFlag = zeros(Int8, size(data, 1))
sortFlag = zeros(Int8, size(data, 1))
for step = depth-1:-1:0
partnerid = nodes .⊻ (1 << step)
direction = (nodes .& (1 << depth)) .== 0 .& (nodes .< partnerid)
@@ -40,6 +120,13 @@ function sort_network!(data, n, depth)
minmax(data, i, partnerid[i+1], keepsmall[i+1])
end
end
if verbose
for i in 1:size(data, 1)
bitonicFlag[i] = is_bitonic(data[i, :])
sortFlag[i] = is_sort(data[i, :])
end
println("depth: $depth | step: $step | bitonicFlag: $bitonicFlag | sorfFlag: $sortFlag")
end
end
end
+25
View File
@@ -0,0 +1,25 @@
/*!
* \file
* \brief Distributed sort implementation
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#include "utils.hpp"
#include "distsort.hpp"
//! Performance timers for each one of the "costly" functions
Timing TfullSort, Texchange, Tminmax, TelbowSort;
bool isActive(mpi_id_t node, size_t nodes) {
if (!((nodes > 0) &&
(nodes <= std::numeric_limits<mpi_id_t>::max()) ))
throw std::runtime_error("(isActive) Non-acceptable value of MPI Nodes\n");
// ^ Assert that mpi_id_t can hold nodes, and thus we can cast without data loss!
return (node >= 0) && (node < static_cast<mpi_id_t>(nodes));
}
+184 -19
View File
@@ -1,22 +1,28 @@
/*!
* \file main.cpp
* \file
* \brief Main application file for PDS HW2 (MPI)
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#include <exception>
#include <iostream>
#include <algorithm>
#include <random>
#include <mpi.h>
#include "matrix.hpp"
#include "utils.hpp"
#include "config.h"
#include "distsort.hpp"
// Global session data
session_t session;
// Global config data
config_t config;
MPI_t<> mpi;
distBuffer_t Data;
Log logger;
Timing Ttotal;
/*!
* A small command line argument parser
@@ -29,29 +35,53 @@ bool get_options(int argc, char* argv[]){
for (int i=1 ; i<argc ; ++i) {
std::string arg(argv[i]); // get current argument
if (arg == "-x" || arg == "--xxxxx") {
if (i+2 < argc) {
// session.corpusMtxFile = std::string(argv[++i]);
// session.corpusDataSet = std::string(argv[++i]);
if (arg == "-q" || arg == "--array-size") {
if (i+1 < argc) {
config.arraySize = 1 << atoi(argv[++i]);
}
else
else {
status = false;
}
else if (arg == "-v" || arg == "--verbose")
session.verbose = true;
}
else if (arg == "--validation") {
config.validation = true;
}
else if (arg == "--ndebug") {
config.ndebug = true;
}
else if (arg == "--perf") {
config.perf = true;
}
else if (arg == "-v" || arg == "--verbose") {
config.verbose = true;
}
else if (arg == "-h" || arg == "--help") {
std::cout << "distbitonic - A distributed bitonic sort\n\n";
std::cout << "distbitonic -x <> [-v]\n";
std::cout << "distbitonic/distbubbletonic - A distributed bitonic sort\n\n";
std::cout << "distbitonic -q <N> [--validation] [--ndebug] [-v]\n";
std::cout << "distbitonic -h\n";
std::cout << "distbubbletonic -q <N> [--validation] [--ndebug] [-v]\n";
std::cout << "distbubbletonic -h\n";
std::cout << '\n';
std::cout << "Options:\n\n";
std::cout << " -q | --array-size <N>\n";
std::cout << " Selects the array size according to size = 2^N\n\n";
std::cout << " --par-sort\n";
std::cout << " Request a parallel full sorting algorithm\n\n";
std::cout << " --validation\n";
std::cout << " Request a full validation at the end, performed by process rank 0\n\n";
std::cout << " --ndebug\n";
std::cout << " Skip debug breakpoint when on debug build.\n\n";
std::cout << " -t | --timing\n";
std::cout << " Request timing measurements output to stdout.\n\n";
std::cout << " -v | --verbose\n";
std::cout << " Request a more verbose output to stdout.\n\n";
std::cout << " -h | --help\n";
std::cout << " Prints this and exit.\n\n";
std::cout << "Examples:\n\n";
std::cout << " ...Example case...:\n";
std::cout << " > distbitonic -x <xxxxx> \n\n";
std::cout << " mpirun -np 4 distbitonic -q 24\n";
std::cout << " Runs distbitonic in 4 MPI processes with 2^24 array points each\n\n";
std::cout << " mpirun -np 16 distbubbletonic -q 20\n";
std::cout << " Runs distbubbletonic in 16 MPI processes with 2^20 array points each\n\n";
exit(0);
}
@@ -64,11 +94,128 @@ bool get_options(int argc, char* argv[]){
return status;
}
/*!
* A simple validator for the entire distributed process
*
* @tparam ShadowedDataT A Shadowed buffer type with random access iterator.
*
* @param data [ShadowedDataT] The local to MPI process
* @param Processes [mpi_id_t] The total number of MPI processes
* @param rank [mpi_id_t] The current process id
*
* @return [bool] True if all are sorted and in total ascending order
*/
template<typename ShadowedDataT>
bool validator(ShadowedDataT& data, mpi_id_t Processes, mpi_id_t rank) {
using value_t = typename ShadowedDataT::value_type;
bool ret = true; // Have faith!
// Local results
value_t lmin = data.front();
value_t lmax = data.back();
value_t lsort = static_cast<value_t>(std::is_sorted(data.begin(), data.end()));
// Gather min/max/sort to rank 0
std::vector<value_t> mins(Processes);
std::vector<value_t> maxes(Processes);
std::vector<value_t> sorts(Processes);
MPI_Datatype datatype = MPI_TypeMapper<value_t>::getType();
MPI_Gather(&lmin, 1, datatype, mins.data(), 1, datatype, 0, MPI_COMM_WORLD);
MPI_Gather(&lmax, 1, datatype, maxes.data(), 1, datatype, 0, MPI_COMM_WORLD);
MPI_Gather(&lsort, 1, datatype, sorts.data(), 1, datatype, 0, MPI_COMM_WORLD);
// Check all results
if (rank == 0) {
for (mpi_id_t r = 1; r < Processes; ++r) {
if (sorts[r] == 0)
ret = false;
if (maxes[r - 1] > mins[r])
ret = false;
}
}
return ret;
}
#if !defined TESTING
/*!
* @return Returns 0, but.... we may throw or exit(1)
*/
int main(int argc, char* argv[]) try {
// try to read command line
// Initialize MPI environment
mpi.init(&argc, &argv);
// try to read command line (after MPI parsing)
if (!get_options(argc, argv))
exit(1);
logger << "MPI environment initialized." <<
" Rank: " << mpi.rank() <<
" Size: " << mpi.size() <<
logger.endl;
#if defined DEBUG
#if defined TESTING
/*
* In case of a debug build we will wait here until sleep_wait
* will reset via debugger. In order to do that the user must attach
* debugger to all processes. For example:
* $> mpirun -np 2 ./<program path>
* $> ps aux | grep <program>
* $> gdb <program> <PID1>
* $> gdb <program> <PID2>
*/
volatile bool sleep_wait = false;
#else
volatile bool sleep_wait = true;
#endif
while (sleep_wait && !config.ndebug)
sleep(1);
#endif
// Initialize local data
logger << "Initialize local array of " << config.arraySize << " elements" << logger.endl;
std::random_device rd; // Mersenne seeded from hw if possible. range: [type_min, type_max]
std::mt19937 gen(rd());
std::uniform_int_distribution<distValue_t > dis(
std::numeric_limits<distValue_t>::min(),
std::numeric_limits<distValue_t>::max()
);
// Fill vector
Data.resize(config.arraySize);
std::generate(Data.begin(), Data.end(), [&]() { return dis(gen); });
// Run distributed sort
if (mpi.rank() == 0)
logger << "Starting distributed sorting ... ";
Ttotal.start();
#if CODE_VERSION == BUBBLETONIC
distBubbletonic(Data, mpi.size(), mpi.rank());
#else
distBitonic (Data, mpi.size(), mpi.rank());
#endif
Ttotal.stop();
if (mpi.rank() == 0)
logger << " Done." << logger.endl;
// Print-outs and validation
if (config.perf) {
Ttotal.print_duration("Total ", mpi.rank());
TfullSort.print_duration("Full-Sort ", mpi.rank());
Texchange.print_duration("Exchange ", mpi.rank());
Tminmax.print_duration("Min-Max ", mpi.rank());
TelbowSort.print_duration("Elbow-Sort", mpi.rank());
}
if (config.validation) {
// If requested, we have the chance to fail!
if (mpi.rank() == 0)
std::cout << "Results validation ...";
bool val = validator(Data, mpi.size(), mpi.rank());
if (mpi.rank() == 0)
std::cout << ((val) ? "\x1B[32m [PASS] \x1B[0m\n" : " \x1B[32m [FAIL] \x1B[0m\n");
}
mpi.finalize();
return 0;
}
catch (std::exception& e) {
@@ -76,3 +223,21 @@ catch (std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
exit(1);
}
#else
#include <gtest/gtest.h>
#include <exception>
/*!
* The testing version of our program
*/
GTEST_API_ int main(int argc, char **argv) try {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
catch (std::exception& e) {
std::cout << "Exception: " << e.what() << '\n';
}
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+330
View File
@@ -0,0 +1,330 @@
/**
* \file
* \brief PDS HW2 tests
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#include <gtest/gtest.h>
#include <algorithm> // rand/srand
#include <ctime> // rand/srand
#include "distsort.hpp"
/* ================================== ascending ================================== */
/*
* bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth);
* depth 0 (the initial ascending pattern)
*/
TEST(TdistBitonic_UT, ascending_test1) {
EXPECT_EQ(ascending<SortMode::Bitonic>(0, 0), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(1, 0), false);
EXPECT_EQ(ascending<SortMode::Bitonic>(2, 0), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(3, 0), false);
EXPECT_EQ(ascending<SortMode::Bitonic>(4, 0), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(5, 0), false);
EXPECT_EQ(ascending<SortMode::Bitonic>(6, 0), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(7, 0), false);
for (mpi_id_t node = 0 ; node < 256 ; ++node) {
EXPECT_EQ(ascending<SortMode::Bitonic>(node, 0), ((node % 2) ? false : true) );
}
}
/*
* bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth);
* depth 1
*/
TEST(TdistBitonic_UT, ascending_test2) {
EXPECT_EQ(ascending<SortMode::Bitonic>(0, 1), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(1, 1), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(2, 1), false);
EXPECT_EQ(ascending<SortMode::Bitonic>(3, 1), false);
EXPECT_EQ(ascending<SortMode::Bitonic>(4, 1), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(5, 1), true);
EXPECT_EQ(ascending<SortMode::Bitonic>(6, 1), false);
EXPECT_EQ(ascending<SortMode::Bitonic>(7, 1), false);
for (mpi_id_t node = 0 ; node < 256 ; ++node) {
EXPECT_EQ(ascending<SortMode::Bitonic>(2*node, 1), ((node % 2) ? false:true));
EXPECT_EQ(ascending<SortMode::Bitonic>(2*node+1, 1), ((node % 2) ? false:true));
}
}
/*
* bool ascending<SortMode::Bitonic>(mpi_id_t node, size_t depth);
* various depths
*/
TEST(TdistBitonic_UT, ascending_test3) {
// Depth = 3
size_t ts_depth = 3;
for (mpi_id_t n = 0 ; n < (1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
for (mpi_id_t n = (1<<(ts_depth)) ; n < 2*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
for (mpi_id_t n = 2*(1<<(ts_depth)) ; n < 3*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
for (mpi_id_t n = 3*(1<<(ts_depth)) ; n < 4*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
// Depth = 4
ts_depth = 4;
for (mpi_id_t n = 0L ; n < (1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
for (mpi_id_t n = (1<<(ts_depth)) ; n < 2*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
for (mpi_id_t n = 2*(1<<(ts_depth)) ; n < 3*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
for (mpi_id_t n = 3*(1<<(ts_depth)) ; n < 4*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
// Depth = 8
ts_depth = 8;
for (mpi_id_t n = 0L ; n < (1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
for (mpi_id_t n = (1<<(ts_depth)) ; n < 2*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
for (mpi_id_t n = 2*(1<<(ts_depth)) ; n < 3*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), true);
for (mpi_id_t n = 3*(1<<(ts_depth)) ; n < 4*(1<<(ts_depth)) ; ++n)
EXPECT_EQ(ascending<SortMode::Bitonic>(n, ts_depth), false);
}
/* ================================== partner ================================== */
/*
* mpi_id_t partner<SortMode::Bitonic>(mpi_id_t node, size_t step);
* step = 0
*/
TEST(TdistBitonic_UT, partner_test1) {
EXPECT_EQ(partner<SortMode::Bitonic>(0, 0), 1);
EXPECT_EQ(partner<SortMode::Bitonic>(1, 0), 0);
EXPECT_EQ(partner<SortMode::Bitonic>(2, 0), 3);
EXPECT_EQ(partner<SortMode::Bitonic>(3, 0), 2);
EXPECT_EQ(partner<SortMode::Bitonic>(4, 0), 5);
EXPECT_EQ(partner<SortMode::Bitonic>(5, 0), 4);
EXPECT_EQ(partner<SortMode::Bitonic>(6, 0), 7);
EXPECT_EQ(partner<SortMode::Bitonic>(7, 0), 6);
for (mpi_id_t node = 0 ; node < 256 ; ++node) {
EXPECT_EQ(partner<SortMode::Bitonic>(node, 0), (node % 2) ? node-1 : node+1);
}
}
/*
* mpi_id_t partner<SortMode::Bitonic>(mpi_id_t node, size_t step);
* step = 1
*/
TEST(TdistBitonic_UT, partner_test2) {
EXPECT_EQ(partner<SortMode::Bitonic>(0, 1), 2);
EXPECT_EQ(partner<SortMode::Bitonic>(1, 1), 3);
EXPECT_EQ(partner<SortMode::Bitonic>(2, 1), 0);
EXPECT_EQ(partner<SortMode::Bitonic>(3, 1), 1);
EXPECT_EQ(partner<SortMode::Bitonic>(4, 1), 6);
EXPECT_EQ(partner<SortMode::Bitonic>(5, 1), 7);
EXPECT_EQ(partner<SortMode::Bitonic>(6, 1), 4);
EXPECT_EQ(partner<SortMode::Bitonic>(7, 1), 5);
for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 2) {
auto n2 = n1 + 1;
EXPECT_EQ(partner<SortMode::Bitonic>(n1, 1), ((n1 % 4) ? n1-2 : n1+2));
EXPECT_EQ(partner<SortMode::Bitonic>(n2, 1), ((n1 % 4) ? n2-2 : n2+2));
}
}
/*
* mpi_id_t partner(mpi_id_t node, size_t step);
* various steps
*/
TEST(TdistBitonic_UT, partner_test3) {
// step = 2
size_t ts_step = 2;
for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 4) {
auto n2 = n1 + 1;
auto n3 = n1 + 2;
auto n4 = n1 + 3;
EXPECT_EQ(partner<SortMode::Bitonic>(n1, ts_step), ((n1 % 8) ? n1-4 : n1+4));
EXPECT_EQ(partner<SortMode::Bitonic>(n2, ts_step), ((n1 % 8) ? n2-4 : n2+4));
EXPECT_EQ(partner<SortMode::Bitonic>(n3, ts_step), ((n1 % 8) ? n3-4 : n3+4));
EXPECT_EQ(partner<SortMode::Bitonic>(n4, ts_step), ((n1 % 8) ? n4-4 : n4+4));
}
// step = 3
ts_step = 3;
for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 8) {
auto n2 = n1 + 1;
auto n3 = n1 + 2;
auto n4 = n1 + 3;
auto n5 = n1 + 4;
auto n6 = n1 + 5;
auto n7 = n1 + 6;
auto n8 = n1 + 7;
EXPECT_EQ(partner<SortMode::Bitonic>(n1, ts_step), ((n1 % 16) ? n1-8 : n1+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n2, ts_step), ((n1 % 16) ? n2-8 : n2+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n3, ts_step), ((n1 % 16) ? n3-8 : n3+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n4, ts_step), ((n1 % 16) ? n4-8 : n4+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n5, ts_step), ((n1 % 16) ? n5-8 : n5+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n6, ts_step), ((n1 % 16) ? n6-8 : n6+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n7, ts_step), ((n1 % 16) ? n7-8 : n7+8));
EXPECT_EQ(partner<SortMode::Bitonic>(n8, ts_step), ((n1 % 16) ? n8-8 : n8+8));
}
// step = 4
ts_step = 4;
for (mpi_id_t n1 = 0 ; n1 < 256 ; n1 += 16) {
auto n2 = n1 + 1;
auto n3 = n1 + 2;
auto n4 = n1 + 3;
auto n5 = n1 + 4;
auto n6 = n1 + 5;
auto n7 = n1 + 6;
auto n8 = n1 + 7;
auto n9 = n1 + 8;
auto n10 = n1 + 9;
auto n11 = n1 + 10;
auto n12 = n1 + 11;
auto n13 = n1 + 12;
auto n14 = n1 + 13;
auto n15 = n1 + 14;
auto n16 = n1 + 15;
EXPECT_EQ(partner<SortMode::Bitonic>(n1, ts_step), ((n1 % 32) ? n1-16 : n1+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n2, ts_step), ((n1 % 32) ? n2-16 : n2+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n3, ts_step), ((n1 % 32) ? n3-16 : n3+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n4, ts_step), ((n1 % 32) ? n4-16 : n4+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n5, ts_step), ((n1 % 32) ? n5-16 : n5+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n6, ts_step), ((n1 % 32) ? n6-16 : n6+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n7, ts_step), ((n1 % 32) ? n7-16 : n7+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n8, ts_step), ((n1 % 32) ? n8-16 : n8+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n9, ts_step), ((n1 % 32) ? n9-16 : n9+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n10, ts_step), ((n1 % 32) ? n10-16 : n10+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n11, ts_step), ((n1 % 32) ? n11-16 : n11+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n12, ts_step), ((n1 % 32) ? n12-16 : n12+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n13, ts_step), ((n1 % 32) ? n13-16 : n13+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n14, ts_step), ((n1 % 32) ? n14-16 : n14+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n15, ts_step), ((n1 % 32) ? n15-16 : n15+16));
EXPECT_EQ(partner<SortMode::Bitonic>(n16, ts_step), ((n1 % 32) ? n16-16 : n16+16));
}
}
/* ================================== keepSmall ================================== */
/*
* bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
* Throw check (Not assert - ASSERT_DEATH)
*/
TEST(TdistBitonic_UT, keepsmall_test1) {
// node and partner must differ or else ...
EXPECT_THROW(keepSmall<SortMode::Bitonic>(0, 0, 0), std::runtime_error);
EXPECT_THROW(keepSmall<SortMode::Bitonic>(1, 1, 42), std::runtime_error);
EXPECT_THROW(keepSmall<SortMode::Bitonic>(7, 7, 42), std::runtime_error);
}
/*
* bool keepsmall(mpi_id_t node, mpi_id_t partner, size_t depth);
*
* depth: 1 | step: 0 | partner: [1, 0, 3, 2, 5, 4, 7, 6] | keepSmall: Bool[1, 0, 0, 1, 1, 0, 0, 1]
*/
TEST(TdistBitonic_UT, keepsmall_test2) {
size_t ts_depth = 1;
mpi_id_t ts_partner[] = {1, 0, 3, 2, 5, 4, 7, 6};
bool ts_expected[] = {1, 0, 0, 1, 1, 0, 0, 1};
for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
}
}
/*
* bool keepsmall(mpi_id_t node, mpi_id_t partner, size_t depth);
*
* depth: 2 | step: 1 | partner: [2, 3, 0, 1, 6, 7, 4, 5] | keepSmall: Bool[1, 1, 0, 0, 0, 0, 1, 1]
*/
TEST(TdistBitonic_UT, keepsmall_test3) {
size_t ts_depth = 2;
mpi_id_t ts_partner[] = {2, 3, 0, 1, 6, 7, 4, 5};
bool ts_expected[] = {1, 1, 0, 0, 0, 0, 1, 1};
for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
}
}
/*
* bool keepsmall(mpi_id_t node, mpi_id_t partner, size_t depth);
*
* depth: 2 | step: 0 | partner: [1, 0, 3, 2, 5, 4, 7, 6] | keepSmall: Bool[1, 0, 1, 0, 0, 1, 0, 1]
*/
TEST(TdistBitonic_UT, keepsmall_test4) {
size_t ts_depth = 2;
mpi_id_t ts_partner[] = {1, 0, 3, 2, 5, 4, 7, 6};
bool ts_expected[] = {1, 0, 1, 0, 0, 1, 0, 1};
for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
}
}
/*
* bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
*
* depth: 3 | step: 2 | partner: [4, 5, 6, 7, 0, 1, 2, 3] | keepsmall: Bool[1, 1, 1, 1, 0, 0, 0, 0]
*/
TEST(TdistBitonic_UT, keepsmall_test5) {
size_t ts_depth = 3;
mpi_id_t ts_partner[] = {4, 5, 6, 7, 0, 1, 2, 3};
bool ts_expected[] = {1, 1, 1, 1, 0, 0, 0, 0};
for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
}
}
/*
* bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
*
* depth: 3 | step: 1 | partner: [2, 3, 0, 1, 6, 7, 4, 5] | keepsmall: Bool[1, 1, 0, 0, 1, 1, 0, 0]
*/
TEST(TdistBitonic_UT, keepsmall_test6) {
size_t ts_depth = 3;
mpi_id_t ts_partner[] = {2, 3, 0, 1, 6, 7, 4, 5};
bool ts_expected[] = {1, 1, 0, 0, 1, 1, 0, 0};
for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
}
}
/*
* bool keepSmall(mpi_id_t node, mpi_id_t partner, size_t depth);
*
* depth: 3 | step: 0 | partner: [1, 0, 3, 2, 5, 4, 7, 6] | keepsmall: Bool[1, 0, 1, 0, 1, 0, 1, 0]
*/
TEST(TdistBitonic_UT, keepsmall_test7) {
size_t ts_depth = 3;
mpi_id_t ts_partner[] = {1, 0, 3, 2, 5, 4, 7, 6};
bool ts_expected[] = {1, 0, 1, 0, 1, 0, 1, 0};
for (mpi_id_t node = 0 ; node < 8 ; ++node ) {
EXPECT_EQ(ts_expected[node], keepSmall<SortMode::Bitonic>(node, ts_partner[node], ts_depth));
}
}
+144
View File
@@ -0,0 +1,144 @@
/**
* \file
* \brief PDS HW2 tests
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#include <gtest/gtest.h>
#include <algorithm> // rand/srand
#include <ctime> // rand/srand
#include "distsort.hpp"
/* ================================== ascending ================================== */
/*
* bool ascending<SortMode::Bubbletonic>(mpi_id_t node, size_t depth);
*/
TEST(TdistBubbletonic_UT, ascending_Bubbletonic_test1) {
EXPECT_EQ(ascending<SortMode::Bubbletonic>(0, 0), true);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(1, 0), false);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(2, 0), true);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(3, 0), false);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(4, 0), true);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(5, 0), false);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(6, 0), true);
EXPECT_EQ(ascending<SortMode::Bubbletonic>(7, 0), false);
for (mpi_id_t node = 0 ; node < 256 ; ++node) {
EXPECT_EQ(ascending<SortMode::Bubbletonic>(node, 7), ((node % 2) ? false : true) );
}
}
/* ================================== partner ================================== */
/*
* mpi_id_t partner<SortMode::Bubbletonic>(mpi_id_t node, size_t step);
* step = 0
*/
TEST(TdistBubbletonic_UT, partner_Bubbletonic_test1) {
size_t ts_step = 0;
mpi_id_t ts_expected[] = {1, 0, 3, 2, 5, 4, 7, 6};
for (mpi_id_t node = 0 ; node < 8 ; ++node) {
EXPECT_EQ(partner<SortMode::Bubbletonic>(node, ts_step), ts_expected[node]);
}
}
/*
* mpi_id_t partner<SortMode::Bubbletonic>(mpi_id_t node, size_t step);
* step = 1
*/
TEST(TdistBubbletonic_UT, partner_Bubbletonic_test2) {
size_t ts_step = 1;
mpi_id_t ts_expected[] = {(mpi_id_t)-1, 2, 1, 4, 3, 6, 5, 8};
for (mpi_id_t node = 0 ; node < 8 ; ++node) {
EXPECT_EQ(partner<SortMode::Bubbletonic>(node, ts_step), ts_expected[node]);
}
}
/*
* mpi_id_t partner<SortMode::Bubbletonic>(mpi_id_t node, size_t step);
* various steps
*/
TEST(TdistBubbletonic_UT, partner_Bubbletonic_test3) {
mpi_id_t ts_even_expected[] = {
1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14
};
mpi_id_t ts_odd_expected[] = {
(mpi_id_t)-1, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16
};
for (size_t step = 0 ; step < 32 ; ++step) {
if (step % 2) {
for (mpi_id_t node = 0; node < 16; ++node) {
EXPECT_EQ(partner<SortMode::Bubbletonic>(node, step), ts_odd_expected[node]);
}
}
else {
for (mpi_id_t node = 0; node < 16; ++node) {
EXPECT_EQ(partner<SortMode::Bubbletonic>(node, step), ts_even_expected[node]);
}
}
}
}
/* ================================== keepSmall ================================== */
/*
* bool keepSmall<SortMode::Bubbletonic>(mpi_id_t node, mpi_id_t partner, size_t depth);
* Throw check (Not assert - ASSERT_DEATH)
*/
TEST(TdistBubbletonic_UT, keepsmall_test1) {
// node and partner must differ or else ...
EXPECT_THROW(keepSmall<SortMode::Bubbletonic>(0, 0, 0), std::runtime_error);
EXPECT_THROW(keepSmall<SortMode::Bubbletonic>(1, 1, 42), std::runtime_error);
EXPECT_THROW(keepSmall<SortMode::Bubbletonic>(7, 7, 42), std::runtime_error);
}
/*
* bool keepSmall<SortMode::Bubbletonic>(mpi_id_t node, mpi_id_t partner, size_t depth);
*/
TEST(TdistBubbletonic_UT, keepsmall_test2) {
// Check various combinations
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(0, 1, 42), true);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(0, 3, 42), true);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(2, 1, 42), false);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(7, 1, 42), false);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(0, 1, 42), true);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(7, 32, 42), true);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(7, 1, 42), false);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(4, 0, 42), false);
EXPECT_EQ(keepSmall<SortMode::Bubbletonic>(4, 9, 42), true);
}
/* ================================== isActive ================================== */
/*
* bool isActive(mpi_id_t node, size_t nodes);
* Throw check
*/
TEST(TdistBubbletonic_UT, isActive_test1) {
EXPECT_THROW(isActive(0, 0), std::runtime_error);
EXPECT_THROW(isActive(0, static_cast<size_t>(std::numeric_limits<mpi_id_t>::max()) + 1), std::runtime_error);
}
/*
* bool isActive(mpi_id_t node, size_t nodes);
* Boundary 3 BVA
*/
TEST(TdistBubbletonic_UT, isActive_test2) {
EXPECT_EQ(isActive(-1, 8), false);
EXPECT_EQ(isActive(0, 8), true);
EXPECT_EQ(isActive(1, 8), true);
EXPECT_EQ(isActive(7, 8), true);
EXPECT_EQ(isActive(8, 8), false);
EXPECT_EQ(isActive(9, 8), false);
}
+93
View File
@@ -0,0 +1,93 @@
/**
* \file
* \brief PDS HW2 tests
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#include <gtest/gtest.h>
#include <algorithm> // rand/srand
#include <ctime> // rand/srand
#include "distsort.hpp"
/* ================================== fullSort ================================== */
/*
*
*/
TEST(TdistCommonUT, fullSort_test1) {
std::vector<uint8_t> ts_data = {3, 2, 1, 4, 5, 7, 8, 6};
std::vector<uint8_t> ts_expected = {1, 2, 3, 4, 5, 6, 7, 8};
bool ts_ascending = true;
fullSort(ts_data, ts_ascending);
EXPECT_EQ((ts_data == ts_expected), true);
}
TEST(TdistCommonUT, fullSort_test2) {
std::vector<uint8_t> ts_data = {3, 2, 1, 4, 5, 7, 8, 6};
std::vector<uint8_t> ts_expected = {8, 7, 6, 5, 4, 3, 2, 1};
bool ts_ascending = false;
fullSort(ts_data, ts_ascending);
EXPECT_EQ((ts_data == ts_expected), true);
}
/* ================================== elbowSort ================================== */
TEST(TdistCommonUT, elbowSort_test1) {
ShadowedVec_t<uint8_t> ts_data1(std::vector<uint8_t>{3, 2, 1, 4, 5, 5, 7, 8});
ShadowedVec_t<uint8_t> ts_data2(std::vector<uint8_t>{4, 5, 7, 8, 5, 3, 2, 1});
ShadowedVec_t<uint8_t> ts_data3(std::vector<uint8_t>{1, 2, 3, 4, 5, 5, 7, 8});
ShadowedVec_t<uint8_t> ts_data4(std::vector<uint8_t>{8, 7, 5, 5, 4, 3, 2, 1});
std::vector<uint8_t> ts_expected = {1, 2, 3, 4, 5, 5, 7, 8};
bool ts_ascending = true;
elbowSort(ts_data1, ts_ascending);
elbowSort(ts_data2, ts_ascending);
elbowSort(ts_data3, ts_ascending);
elbowSort(ts_data4, ts_ascending);
EXPECT_EQ((ts_data1 == ts_expected), true);
EXPECT_EQ((ts_data2 == ts_expected), true);
EXPECT_EQ((ts_data3 == ts_expected), true);
EXPECT_EQ((ts_data4 == ts_expected), true);
}
TEST(TdistCommonUT, elbowSort_test2) {
ShadowedVec_t<uint8_t> ts_data1(std::vector<uint8_t>{3, 2, 1, 4, 5, 5, 7, 8});
ShadowedVec_t<uint8_t> ts_data2(std::vector<uint8_t>{4, 5, 7, 8, 5, 3, 2, 1});
ShadowedVec_t<uint8_t> ts_data3(std::vector<uint8_t>{1, 2, 3, 4, 5, 5, 7, 8});
ShadowedVec_t<uint8_t> ts_data4(std::vector<uint8_t>{8, 7, 5, 5, 4, 3, 2, 1});
std::vector<uint8_t> ts_expected = {8, 7, 5, 5, 4, 3, 2, 1};
bool ts_ascending = false;
elbowSort(ts_data1, ts_ascending);
elbowSort(ts_data2, ts_ascending);
elbowSort(ts_data3, ts_ascending);
elbowSort(ts_data4, ts_ascending);
EXPECT_EQ((ts_data1 == ts_expected), true);
EXPECT_EQ((ts_data2 == ts_expected), true);
EXPECT_EQ((ts_data3 == ts_expected), true);
EXPECT_EQ((ts_data4 == ts_expected), true);
}
TEST(TdistCommonUT, elbowSort_test3) {
ShadowedVec_t<uint8_t> ts_data(std::vector<uint8_t>{8, 7, 5, 5, 4, 3, 2, 1});
std::vector<uint8_t> ts_expected_asc = {1, 2, 3, 4, 5, 5, 7, 8};
std::vector<uint8_t> ts_expected_des = {8, 7, 5, 5, 4, 3, 2, 1};
// Check alternation for active-shadow vector inside Buffer and elbow algorithm
elbowSort(ts_data, true);
EXPECT_EQ((ts_data == ts_expected_asc), true);
elbowSort(ts_data, false);
EXPECT_EQ((ts_data == ts_expected_des), true);
elbowSort(ts_data, true);
EXPECT_EQ((ts_data == ts_expected_asc), true);
elbowSort(ts_data, false);
EXPECT_EQ((ts_data == ts_expected_des), true);
}
+211
View File
@@ -0,0 +1,211 @@
/**
* \file
* \brief PDS HW2 tests
*
* To run these test execute:
* export OMP_NUM_THREADS=4 # optional to see parallelization speed-up
* make tests
* mpirun -np <N> ./out/tests
*
* Note:
* Yes each process runs the entire test suite!!
*
* \author
* Christos Choutouridis AEM:8997
* <cchoutou@ece.auth.gr>
*/
#include <gtest/gtest.h>
#include <mpi.h>
#include <random>
#include "distsort.hpp"
/*
* Global fixtures
*/
// MPI handler for the test session
MPI_t<> ts_mpi;
// Mersenne seeded from hw if possible. range: [type_min, type_max]
std::random_device rd;
std::mt19937 gen(rd());
class TMPIdistSort : public ::testing::Test {
protected:
static void SetUpTestSuite() {
int argc = 0;
char** argv = nullptr;
ts_mpi.init(&argc, &argv);
}
static void TearDownTestSuite() {
ts_mpi.finalize();
}
};
/*
* MPI: SysTest (acceptance)
* Each process executes distBubbletonic for uin8_t [16]
*/
TEST_F(TMPIdistSort, distBubbletonic_test1) {
// Create and fill vector
using tsValue_t = uint8_t; // Test parameters
size_t ts_buffer_size = 16;
ShadowedVec_t<tsValue_t> ts_Data;
std::uniform_int_distribution<tsValue_t > dis(
std::numeric_limits<tsValue_t>::min(),
std::numeric_limits<tsValue_t>::max()
);
ts_Data.resize(ts_buffer_size);
std::generate(ts_Data.begin(), ts_Data.end(), [&]() { return dis(gen); });
// Execute function under test in all processes
distBubbletonic(ts_Data, ts_mpi.size(), ts_mpi.rank());
// Local min and max
auto local_min = *std::min_element(ts_Data.begin(), ts_Data.end());
auto local_max = *std::max_element(ts_Data.begin(), ts_Data.end());
// Gather min/max to rank 0
std::vector<tsValue_t> global_mins(ts_mpi.size());
std::vector<tsValue_t> global_maxes(ts_mpi.size());
MPI_Datatype datatype = MPI_TypeMapper<tsValue_t>::getType();
MPI_Gather(&local_min, 1, datatype, global_mins.data(), 1, datatype, 0, MPI_COMM_WORLD);
MPI_Gather(&local_max, 1, datatype, global_maxes.data(), 1, datatype, 0, MPI_COMM_WORLD);
// Check results
EXPECT_EQ(std::is_sorted(ts_Data.begin(), ts_Data.end()), true);
if (ts_mpi.rank() == 0) {
for (size_t i = 1; i < global_mins.size(); ++i) {
EXPECT_LE(global_maxes[i - 1], global_mins[i]);
}
}
}
/*
* MPI: SysTest (acceptance)
* Each process executes distBubbletonic for uin32_t [1 << 16]
*/
TEST_F(TMPIdistSort, distBubbletonic_test2) {
// Create and fill vector
using tsValue_t = uint32_t; // Test parameters
size_t ts_buffer_size = 1 << 16;
ShadowedVec_t<tsValue_t> ts_Data;
std::uniform_int_distribution<tsValue_t > dis(
std::numeric_limits<tsValue_t>::min(),
std::numeric_limits<tsValue_t>::max()
);
ts_Data.resize(ts_buffer_size);
std::generate(ts_Data.begin(), ts_Data.end(), [&]() { return dis(gen); });
// Execute function under test in all processes
distBubbletonic(ts_Data, ts_mpi.size(), ts_mpi.rank());
// Local min and max
auto local_min = *std::min_element(ts_Data.begin(), ts_Data.end());
auto local_max = *std::max_element(ts_Data.begin(), ts_Data.end());
// Gather min/max to rank 0
std::vector<tsValue_t> global_mins(ts_mpi.size());
std::vector<tsValue_t> global_maxes(ts_mpi.size());
MPI_Datatype datatype = MPI_TypeMapper<tsValue_t>::getType();
MPI_Gather(&local_min, 1, datatype, global_mins.data(), 1, datatype, 0, MPI_COMM_WORLD);
MPI_Gather(&local_max, 1, datatype, global_maxes.data(), 1, datatype, 0, MPI_COMM_WORLD);
// Check results
EXPECT_EQ(std::is_sorted(ts_Data.begin(), ts_Data.end()), true);
if (ts_mpi.rank() == 0) {
for (size_t i = 1; i < global_mins.size(); ++i) {
EXPECT_LE(global_maxes[i - 1], global_mins[i]);
}
}
}
/*
* MPI: SysTest (acceptance)
* Each process executes distBitonic for uin8_t [16]
*/
TEST_F(TMPIdistSort, distBitonic_test1) {
// Create and fill vector
using tsValue_t = uint8_t; // Test parameters
size_t ts_buffer_size = 16;
ShadowedVec_t<tsValue_t> ts_Data;
std::uniform_int_distribution<tsValue_t > dis(
std::numeric_limits<tsValue_t>::min(),
std::numeric_limits<tsValue_t>::max()
);
ts_Data.resize(ts_buffer_size);
std::generate(ts_Data.begin(), ts_Data.end(), [&]() { return dis(gen); });
// Execute function under test in all processes
distBitonic(ts_Data, ts_mpi.size(), ts_mpi.rank());
// Local min and max
auto local_min = *std::min_element(ts_Data.begin(), ts_Data.end());
auto local_max = *std::max_element(ts_Data.begin(), ts_Data.end());
// Gather min/max to rank 0
std::vector<tsValue_t> global_mins(ts_mpi.size());
std::vector<tsValue_t> global_maxes(ts_mpi.size());
MPI_Datatype datatype = MPI_TypeMapper<tsValue_t>::getType();
MPI_Gather(&local_min, 1, datatype, global_mins.data(), 1, datatype, 0, MPI_COMM_WORLD);
MPI_Gather(&local_max, 1, datatype, global_maxes.data(), 1, datatype, 0, MPI_COMM_WORLD);
// Check results
EXPECT_EQ(std::is_sorted(ts_Data.begin(), ts_Data.end()), true);
if (ts_mpi.rank() == 0) {
for (size_t i = 1; i < global_mins.size(); ++i) {
EXPECT_LE(global_maxes[i - 1], global_mins[i]);
}
}
}
/*
* MPI: SysTest (acceptance)
* Each process executes distBitonic for uin32_t [1 << 16]
*/
TEST_F(TMPIdistSort, distBitonic_test2) {
// Create and fill vector
using tsValue_t = uint32_t; // Test parameters
size_t ts_buffer_size = 1 << 16;
ShadowedVec_t<tsValue_t> ts_Data;
std::uniform_int_distribution<tsValue_t > dis(
std::numeric_limits<tsValue_t>::min(),
std::numeric_limits<tsValue_t>::max()
);
ts_Data.resize(ts_buffer_size);
std::generate(ts_Data.begin(), ts_Data.end(), [&]() { return dis(gen); });
// Execute function under test in all processes
distBitonic(ts_Data, ts_mpi.size(), ts_mpi.rank());
// Local min and max
auto local_min = *std::min_element(ts_Data.begin(), ts_Data.end());
auto local_max = *std::max_element(ts_Data.begin(), ts_Data.end());
// Gather min/max to rank 0
std::vector<tsValue_t> global_mins(ts_mpi.size());
std::vector<tsValue_t> global_maxes(ts_mpi.size());
MPI_Datatype datatype = MPI_TypeMapper<tsValue_t>::getType();
MPI_Gather(&local_min, 1, datatype, global_mins.data(), 1, datatype, 0, MPI_COMM_WORLD);
MPI_Gather(&local_max, 1, datatype, global_maxes.data(), 1, datatype, 0, MPI_COMM_WORLD);
// Check results
EXPECT_EQ(std::is_sorted(ts_Data.begin(), ts_Data.end()), true);
if (ts_mpi.rank() == 0) {
for (size_t i = 1; i < global_mins.size(); ++i) {
EXPECT_LE(global_maxes[i - 1], global_mins[i]);
}
}
}