diff --git a/README.md b/README.md
index e3ea20ee..684fcc2e 100644
--- a/README.md
+++ b/README.md
@@ -62,6 +62,15 @@ files and folders appear on your system:
----------
What's New
----------
+New in Intel(R) MPI Benchmarks 2019 Update 1
+----------------------------------------
+- Added the Reduce_scatter_block benchmark for IMB-MPI1.
+- Added the aggregate_mode option that specifies the mode for IMB-IO, IMB-EXT and IMB-RMA.
+- Added the alignment option that controls buffer alignment.
+- Updated the following options:
+ - -data_type now supports double.
+ - -red_data_type now supports double.
+
New in Intel(R) MPI Benchmarks 2019
----------------------------------------
- New IMB-MT benchmarks.
diff --git a/ReadMe_IMB.txt b/ReadMe_IMB.txt
index ef491861..7b9abe8d 100644
--- a/ReadMe_IMB.txt
+++ b/ReadMe_IMB.txt
@@ -1,7 +1,7 @@
----------------------------------
-Intel(R) MPI Benchmarks 2019
+--------------------------------------
+Intel(R) MPI Benchmarks 2019 Update 1
README
----------------------------------
+--------------------------------------
--------
Contents
@@ -62,22 +62,31 @@ files and folders appear on your system:
----------
What's New
----------
+New in Intel(R) MPI Benchmarks 2019 Update 1
+----------------------------------------
+- Added the Reduce_scatter_block benchmark for IMB-MPI1.
+- Added the aggregate_mode option that specifies the mode for IMB-IO, IMB-EXT and IMB-RMA.
+- Added the alignment option that controls buffer alignment.
+- Updated the following options:
+ - -data_type now supports double.
+ - -red_data_type now supports double.
+
+
New in Intel(R) MPI Benchmarks 2019
----------------------------------------
- New IMB-MT benchmarks.
- The benchmarks implement the multi-threaded version of IMB-MPI1 benchmarks
- using the OpenMP* paradigm.
-- New benchmarks infrastructure for easier benchmarks extension is
- implemented in C++ (See the guide:
- https://software.intel.com/en-us/articles/creating-custom-benchmarks-for-imb-2019).
- The IMB-MPI1, IMB-RMA, IMB-NBC, IMB-EXT, IMB-IO, and IMB-MT implementation
- is now based on the new C++ infrastructure. The legacy infrastructure is
- preserved in the src_c subdirectory.
+ The benchmarks implement the multi-threaded version of IMB-MPI1
+ benchmarks using the OpenMP* paradigm.
+- New benchmarks infrastructure for easier benchmarks extension is implemented in C++
+ (See the guide: https://software.intel.com/en-us/articles/creating-custom-benchmarks-for-imb-2019).
+ The IMB-MPI1, IMB-RMA, IMB-NBC, IMB-EXT, IMB-IO and IMB-MT implementation is now based on the new C++
+ infrastructure.
+ The legacy infrastructure is preserved in the src_c subdirectory.
- Syntax changes for the -include and -exclude options.
Benchmarks to include and exclude now must be separated by a comma rather
than a space. Benchmarks to launch can be separated by a comma or a space.
-- Iteration policy can no longer be set with the -iter option. Use the
- -iter_policy instead.
+- Iteration policy can no longer be set with the -iter option. Use the -iter_policy
+ instead.
- Added a new benchmark BarrierMT for IMB-MT.
- Added new options:
- -noheader for IMB-MT disables printing of benchmark headers.
@@ -90,7 +99,7 @@ New in Intel(R) MPI Benchmarks 2019
New in Intel(R) MPI Benchmarks 2018 Update 1
--------------------------------------------
-- Support for the Microsoft* Visual Studio* 2017. Microsoft* Visual Studio* 2012
+- Support for the Microsoft* Visual Studio* 2017. Microsoft* Visual Studio* 2012
support is removed.
New in Intel(R) MPI Benchmarks 2018
@@ -103,16 +112,15 @@ New in Intel(R) MPI Benchmarks 2018
New in Intel(R) MPI Benchmarks 2017 Update 1
--------------------------------------------
- Added a new option -imb_barrier.
-- The PingPong and PingPing benchmarks are now equivalent to
- PingPongSpecificSource and PingPingSpecificSource, respectively. Their old
- behavior (with MPI_ANY_SOURCE) is available in PingPongAnySource and
- PingPingAnySource.
+- The PingPong and PingPing benchmarks are now equivalent to PingPongSpecificSource
+ and PingPingSpecificSource, respectively. Their old behavior (with MPI_ANY_SOURCE)
+ is available in PingPongAnySource and PingPingAnySource.
New in Intel(R) MPI Benchmarks 2017
-------------------------------------------
- Changed default values for the -sync and -root_shift options.
- Support for the Microsoft* Visual Studio* 2015. Microsoft* Visual Studio* 2010
- support is removed.
+support is removed.
- Bug fixes.
New in Intel(R) MPI Benchmarks 4.1 Update 1
@@ -122,13 +130,11 @@ New in Intel(R) MPI Benchmarks 4.1 Update 1
New in Intel(R) MPI Benchmarks 4.1
-------------------------------------------
- Introduced two new benchmarks: uniband and biband.
-- Introduced two new command-line options for collective benchmarks: -sync and
- -root_shift.
+- Introduced two new command-line options for collective benchmarks: -sync and -root_shift.
New in Intel(R) MPI Benchmarks 4.0 Update 2
-------------------------------------------
-- Fix of a bug where benchmarking was failing on certain message lengths with
- -DCHECK.
+- Fix of a bug where benchmarking was failing on certain message lengths with -DCHECK.
New in Intel(R) MPI Benchmarks 4.0 Update 1
-------------------------------------------
@@ -137,20 +143,19 @@ New in Intel(R) MPI Benchmarks 4.0 Update 1
New in Intel(R) MPI Benchmarks 4.0
-------------------------------------------
- Introduced new components IMB-NBC and IMB-RMA that conform to the MPI-3.0
- standard.
- Note: These components can only be built and used with MPI libraries that
- conform to the MPI-3 standard.
+standard.
+ Note: These components can only be built and used with MPI libraries that conform
+ to the MPI-3 standard.
- Added new targets to the Linux* OS Makefiles:
- NBC for building IMB-NBC
- RMA for building IMB-RMA
-- Updated Microsoft* Visual Studio* solutions to include the IMB-NBC and IMB-RMA
- targets.
+- Updated Microsoft* Visual Studio* solutions to include the IMB-NBC and
+IMB-RMA targets.
- Consolidated all first-use documents in ReadMe_IMB.txt to improve usability.
-- Introduced a new feature to set the appropriate algorithm for automatic
- calculation of iterations. The algorithm can be set through the -iter and
- -iter_policy options.
+- Introduced a new feature to set the appropriate algorithm for automatic calculation
+of iterations. The algorithm can be set through the -iter and -iter_policy options.
- Support for the Microsoft* Visual Studio* 2013. Microsoft* Visual Studio* 2008
- support is removed.
+support is removed.
--------------------
Command-Line Control
@@ -167,8 +172,7 @@ command-line parameters.
-----------------------------------------
Building Instructions for Linux* OS
-----------------------------------------
-1) Set the CC variable to point to the appropriate compiler wrapper, mpiicc or
- mpicc.
+1) Set the CC variable to point to the appropriate compiler wrapper, mpiicc or mpicc.
2) Run one or more Makefile commands below:
make clean - remove legacy binary object files and executable files
diff --git a/WINDOWS/IMB-EXT_VS_2013/IMB-EXT.rc b/WINDOWS/IMB-EXT_VS_2013/IMB-EXT.rc
index 266474f1..eddb5cc0 100644
--- a/WINDOWS/IMB-EXT_VS_2013/IMB-EXT.rc
+++ b/WINDOWS/IMB-EXT_VS_2013/IMB-EXT.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-EXT"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-EXT.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-EXT_VS_2015/IMB-EXT.rc b/WINDOWS/IMB-EXT_VS_2015/IMB-EXT.rc
index 266474f1..eddb5cc0 100644
--- a/WINDOWS/IMB-EXT_VS_2015/IMB-EXT.rc
+++ b/WINDOWS/IMB-EXT_VS_2015/IMB-EXT.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-EXT"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-EXT.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-EXT_VS_2017/IMB-EXT.rc b/WINDOWS/IMB-EXT_VS_2017/IMB-EXT.rc
index 266474f1..eddb5cc0 100644
--- a/WINDOWS/IMB-EXT_VS_2017/IMB-EXT.rc
+++ b/WINDOWS/IMB-EXT_VS_2017/IMB-EXT.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-EXT"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-EXT.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-IO_VS_2013/IMB-IO.rc b/WINDOWS/IMB-IO_VS_2013/IMB-IO.rc
index ae9b59de..6215f6a9 100644
--- a/WINDOWS/IMB-IO_VS_2013/IMB-IO.rc
+++ b/WINDOWS/IMB-IO_VS_2013/IMB-IO.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-IO"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-IO.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-IO_VS_2015/IMB-IO.rc b/WINDOWS/IMB-IO_VS_2015/IMB-IO.rc
index ae9b59de..6215f6a9 100644
--- a/WINDOWS/IMB-IO_VS_2015/IMB-IO.rc
+++ b/WINDOWS/IMB-IO_VS_2015/IMB-IO.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-IO"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-IO.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-IO_VS_2017/IMB-IO.rc b/WINDOWS/IMB-IO_VS_2017/IMB-IO.rc
index ae9b59de..6215f6a9 100644
--- a/WINDOWS/IMB-IO_VS_2017/IMB-IO.rc
+++ b/WINDOWS/IMB-IO_VS_2017/IMB-IO.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-IO"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-IO.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.rc b/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.rc
index 57bcf000..f22e594b 100644
--- a/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.rc
+++ b/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-MPI1"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-MPI1.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.vcxproj b/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.vcxproj
index a645996c..815bd06e 100644
--- a/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.vcxproj
+++ b/WINDOWS/IMB-MPI1_VS_2013/IMB-MPI1.vcxproj
@@ -137,6 +137,7 @@
+
diff --git a/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.rc b/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.rc
index 57bcf000..f22e594b 100644
--- a/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.rc
+++ b/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-MPI1"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-MPI1.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.vcxproj b/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.vcxproj
index 91a0f2a1..51490a62 100644
--- a/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.vcxproj
+++ b/WINDOWS/IMB-MPI1_VS_2015/IMB-MPI1.vcxproj
@@ -137,6 +137,7 @@
+
diff --git a/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.rc b/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.rc
index 57bcf000..f22e594b 100644
--- a/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.rc
+++ b/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-MPI1"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-MPI1.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.vcxproj b/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.vcxproj
index 3955e6b9..0967a711 100644
--- a/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.vcxproj
+++ b/WINDOWS/IMB-MPI1_VS_2017/IMB-MPI1.vcxproj
@@ -138,6 +138,7 @@
+
diff --git a/WINDOWS/IMB-MT_VS_2013/IMB-MT.rc b/WINDOWS/IMB-MT_VS_2013/IMB-MT.rc
index bf7d4848..a4fd0424 100644
--- a/WINDOWS/IMB-MT_VS_2013/IMB-MT.rc
+++ b/WINDOWS/IMB-MT_VS_2013/IMB-MT.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-MT"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-MT.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-MT_VS_2015/IMB-MT.rc b/WINDOWS/IMB-MT_VS_2015/IMB-MT.rc
index bf7d4848..a4fd0424 100644
--- a/WINDOWS/IMB-MT_VS_2015/IMB-MT.rc
+++ b/WINDOWS/IMB-MT_VS_2015/IMB-MT.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-MT"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-MT.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-MT_VS_2017/IMB-MT.rc b/WINDOWS/IMB-MT_VS_2017/IMB-MT.rc
index bf7d4848..a4fd0424 100644
--- a/WINDOWS/IMB-MT_VS_2017/IMB-MT.rc
+++ b/WINDOWS/IMB-MT_VS_2017/IMB-MT.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-MT"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-MT.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-NBC_VS_2013/IMB-NBC.rc b/WINDOWS/IMB-NBC_VS_2013/IMB-NBC.rc
index 8678addf..fa0b374e 100644
--- a/WINDOWS/IMB-NBC_VS_2013/IMB-NBC.rc
+++ b/WINDOWS/IMB-NBC_VS_2013/IMB-NBC.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-NBC"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-NBC.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-NBC_VS_2015/IMB-NBC.rc b/WINDOWS/IMB-NBC_VS_2015/IMB-NBC.rc
index 8678addf..fa0b374e 100644
--- a/WINDOWS/IMB-NBC_VS_2015/IMB-NBC.rc
+++ b/WINDOWS/IMB-NBC_VS_2015/IMB-NBC.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-NBC"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-NBC.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-NBC_VS_2017/IMB-NBC.rc b/WINDOWS/IMB-NBC_VS_2017/IMB-NBC.rc
index 8678addf..fa0b374e 100644
--- a/WINDOWS/IMB-NBC_VS_2017/IMB-NBC.rc
+++ b/WINDOWS/IMB-NBC_VS_2017/IMB-NBC.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-NBC"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-NBC.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-RMA_VS_2013/IMB-RMA.rc b/WINDOWS/IMB-RMA_VS_2013/IMB-RMA.rc
index ef0624dc..8e7889df 100644
--- a/WINDOWS/IMB-RMA_VS_2013/IMB-RMA.rc
+++ b/WINDOWS/IMB-RMA_VS_2013/IMB-RMA.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-RMA"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-RMA.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-RMA_VS_2015/IMB-RMA.rc b/WINDOWS/IMB-RMA_VS_2015/IMB-RMA.rc
index ef0624dc..8e7889df 100644
--- a/WINDOWS/IMB-RMA_VS_2015/IMB-RMA.rc
+++ b/WINDOWS/IMB-RMA_VS_2015/IMB-RMA.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-RMA"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-RMA.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/WINDOWS/IMB-RMA_VS_2017/IMB-RMA.rc b/WINDOWS/IMB-RMA_VS_2017/IMB-RMA.rc
index ef0624dc..8e7889df 100644
--- a/WINDOWS/IMB-RMA_VS_2017/IMB-RMA.rc
+++ b/WINDOWS/IMB-RMA_VS_2017/IMB-RMA.rc
@@ -53,8 +53,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2019,0,0,0
- PRODUCTVERSION 2019,0,0,0
+ FILEVERSION 2019,0,1,0
+ PRODUCTVERSION 2019,0,1,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -71,12 +71,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corporation"
VALUE "FileDescription", "Intel(R) MPI Benchmarks"
- VALUE "FileVersion", "2019.0.0"
+ VALUE "FileVersion", "2019.0.1"
VALUE "InternalName", "IMB-RMA"
VALUE "LegalCopyright", "Copyright 2003-2018 Intel Corporation."
VALUE "OriginalFilename", "IMB-RMA.exe"
VALUE "ProductName", "Intel(R) MPI Benchmarks"
- VALUE "ProductVersion", "2019.0.0"
+ VALUE "ProductVersion", "2019.0.1"
END
END
BLOCK "VarFileInfo"
diff --git a/src_c/IMB_comm_info.h b/src_c/IMB_comm_info.h
index 07b07448..3c718c69 100644
--- a/src_c/IMB_comm_info.h
+++ b/src_c/IMB_comm_info.h
@@ -74,6 +74,15 @@ typedef enum {
CT_RESIZE_VEC = 3
} CONTIG_TYPES;
+#if (defined EXT || defined RMA || defined MPIIO)
+ typedef enum {
+ AM_ERROR = -1,
+ AM_TURN_OFF = 0,
+ AM_TURN_ON = 1,
+ AM_TURN_MULTI = 2
+ } AGGREGATE_MODE;
+#endif
+
#ifdef MPIIO
typedef struct { int Locsize; MPI_Offset Offset; int Totalsize;} SPLITTING;
#endif
@@ -171,6 +180,10 @@ struct comm_info {
MPI_Errhandler ERRW;
#endif
+#if (defined EXT || defined RMA || defined MPIIO)
+ AGGREGATE_MODE aggregate_mode; /*turn on different types of aggregate modes*/
+#endif
+
};
#endif
diff --git a/src_c/IMB_g_info.c b/src_c/IMB_g_info.c
index f796fa7c..3e17c07e 100644
--- a/src_c/IMB_g_info.c
+++ b/src_c/IMB_g_info.c
@@ -69,7 +69,7 @@ For more documentation than found here, see
-char* VERSION="2019";
+char* VERSION="2019 Update 1";
#include
#include
diff --git a/src_c/IMB_init.c b/src_c/IMB_init.c
index 1b06c675..c730e3c8 100644
--- a/src_c/IMB_init.c
+++ b/src_c/IMB_init.c
@@ -1427,6 +1427,10 @@ void IMB_set_default(struct comm_info* c_info) {
c_info->info = MPI_INFO_NULL;
c_info->ERRW = MPI_ERRHANDLER_NULL;
#endif /*EXT || RMA*/
+
+#if (defined EXT || defined RMA || defined MPIIO)
+ c_info->aggregate_mode = AM_ERROR;
+#endif /*EXT || RMA || MPIIO*/
}
static void IMB_init_Blist_item_pool() {
diff --git a/src_c/IMB_mem_manager.c b/src_c/IMB_mem_manager.c
index 49e0a23e..5f7006eb 100644
--- a/src_c/IMB_mem_manager.c
+++ b/src_c/IMB_mem_manager.c
@@ -86,6 +86,7 @@ For more documentation than found here, see
#include "IMB_prototypes.h"
#include /* for INT_MAX declaration*/
+#include
void* IMB_v_alloc(size_t Len, char* where) {
/*
@@ -153,6 +154,31 @@ In/out variables:
}
#endif /*0*/
+size_t IMB_buffer_alignment = (2 * 1024 * 1024);
+
+void* IMB_aligned_buffer_alloc(size_t *size, char* where) {
+ void *p;
+ void *q;
+ size_t a = IMB_buffer_alignment;
+ size_t asize = (a + *size + a - 1) & ~(a - 1);
+ p = IMB_v_alloc(asize, where);
+ q = (void *)((uintptr_t)p + sizeof(void*));
+ if (((uintptr_t)q) & (a - 1)) {
+ uintptr_t offset = a - (((uintptr_t)q) & (a - 1));
+ q = (void *)((uintptr_t)q + offset);
+ }
+ *((void **)((uintptr_t)q - sizeof(void*))) = p;
+ *size = ((uintptr_t)p + asize - (uintptr_t)q);
+ return q;
+}
+
+void IMB_aligned_buffer_free(void **B) {
+ if (*B) {
+ void *p = *((void **)((uintptr_t)(*B) - sizeof(void*)));
+ IMB_v_free(&p);
+ *B = NULL;
+ }
+}
/***************************************************************************/
void IMB_alloc_buf(struct comm_info* c_info, char* where, size_t s_len,
@@ -182,56 +208,26 @@ In/out variables:
Send/Recv buffer components get allocated
*/
-/* July 2002 V2.2.1 change: use MPI_Alloc_mem */
-#if ( defined EXT || defined MPIIO || RMA )
- MPI_Aint slen = (MPI_Aint)(max(1, s_len));
- MPI_Aint rlen = (MPI_Aint)(max(1, r_len));
- int ierr;
-#else
s_len = max(1, s_len);
r_len = max(1, r_len);
-#endif
if (c_info->s_alloc < s_len) {
- /* July 2002 V2.2.1 change: use MPI_Alloc_mem */
-#if ( defined EXT || defined MPIIO || RMA)
- if (c_info->s_buffer)
- MPI_Free_mem(c_info->s_buffer);
-
- ierr = MPI_Alloc_mem(slen, MPI_INFO_NULL, &c_info->s_buffer);
- MPI_ERRHAND(ierr);
- c_info->s_alloc = slen;
-#else
- IMB_v_free((void**)&c_info->s_buffer);
-
- s_len *= c_info->size_scale;
-
- c_info->s_buffer = IMB_v_alloc(s_len, where);
- c_info->s_alloc = s_len;
-#endif
-
+ size_t size;
+ IMB_aligned_buffer_free((void**)&c_info->s_buffer);
+ size = s_len * ((size_t)c_info->size_scale);
+ size = (size + IMB_buffer_alignment - 1) & ~(IMB_buffer_alignment - 1);
+ c_info->s_buffer = IMB_aligned_buffer_alloc(&size, where);
+ c_info->s_alloc = size / ((size_t)c_info->size_scale);
c_info->s_data = (assign_type*)c_info->s_buffer;
}
if (c_info->r_alloc < r_len) {
- /* July 2002 V2.2.1 change: use MPI_Alloc_mem */
-#if ( defined EXT || defined MPIIO || RMA)
- if (c_info->r_buffer)
- MPI_Free_mem(c_info->r_buffer);
-
- ierr = MPI_Alloc_mem(rlen, MPI_INFO_NULL, &c_info->r_buffer);
- MPI_ERRHAND(ierr);
- c_info->r_alloc = rlen;
-#else
- IMB_v_free((void**)&c_info->r_buffer);
-
- r_len *= c_info->size_scale;
-
-
- c_info->r_buffer = IMB_v_alloc(r_len, where);
- c_info->r_alloc = r_len;
-#endif
-
+ size_t size;
+ IMB_aligned_buffer_free((void**)&c_info->r_buffer);
+ size = r_len * ((size_t)c_info->size_scale);
+ size = (size + IMB_buffer_alignment - 1) & ~(IMB_buffer_alignment - 1);
+ c_info->r_buffer = IMB_aligned_buffer_alloc(&size, where);
+ c_info->r_alloc = size / ((size_t)c_info->size_scale);
c_info->r_data = (assign_type*)c_info->r_buffer;
}
}
@@ -965,14 +961,8 @@ In/out variables:
see [1] for more information
*/
-/* July 2002 V2.2.1 change: use MPI_Free_mem */
if (c_info->s_alloc > 0) {
-#if (defined EXT || defined MPIIO || defined RMA)
- MPI_Free_mem(c_info->s_buffer);
-#else
- IMB_v_free((void**)&c_info->s_buffer);
-#endif
-
+ IMB_aligned_buffer_free((void**)&c_info->s_buffer);
c_info->s_alloc = 0;
c_info->s_buffer = NULL;
@@ -991,14 +981,8 @@ In/out variables:
see [1] for more information
*/
-/* July 2002 V2.2.1 change: use MPI_Free_mem */
if (c_info->r_alloc > 0) {
-#if (defined EXT || defined MPIIO || defined RMA)
- MPI_Free_mem(c_info->r_buffer);
-#else
- IMB_v_free((void**)&c_info->r_buffer);
-#endif
-
+ IMB_aligned_buffer_free((void**)&c_info->r_buffer);
c_info->r_alloc = 0;
c_info->r_buffer = NULL;
diff --git a/src_c/IMB_prototypes.h b/src_c/IMB_prototypes.h
index 22628d2e..d9cc09ab 100644
--- a/src_c/IMB_prototypes.h
+++ b/src_c/IMB_prototypes.h
@@ -104,6 +104,9 @@ void IMB_reduce(struct comm_info* c_info, int size, struct iter_schedule* ITERAT
void IMB_reduce_scatter(struct comm_info* c_info, int size, struct iter_schedule* ITERATIONS,
MODES RUN_MODE, double* time);
+void IMB_reduce_scatter_block(struct comm_info* c_info, int size, struct iter_schedule* ITERATIONS,
+ MODES RUN_MODE, double* time);
+
void IMB_sendrecv(struct comm_info* c_info, int size, struct iter_schedule* ITERATIONS,
MODES RUN_MODE, double* time);
diff --git a/src_c/IMB_reduce_scatter_block.c b/src_c/IMB_reduce_scatter_block.c
new file mode 100644
index 00000000..350cc964
--- /dev/null
+++ b/src_c/IMB_reduce_scatter_block.c
@@ -0,0 +1,168 @@
+/*****************************************************************************
+ * *
+ * Copyright 2003-2018 Intel Corporation. *
+ * *
+ *****************************************************************************
+
+This code is covered by the Community Source License (CPL), version
+1.0 as published by IBM and reproduced in the file "license.txt" in the
+"license" subdirectory. Redistribution in source and binary form, with
+or without modification, is permitted ONLY within the regulations
+contained in above mentioned license.
+
+Use of the name and trademark "Intel(R) MPI Benchmarks" is allowed ONLY
+within the regulations of the "License for Use of "Intel(R) MPI
+Benchmarks" Name and Trademark" as reproduced in the file
+"use-of-trademark-license.txt" in the "license" subdirectory.
+
+THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
+CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
+LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
+solely responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable
+laws, damage to or loss of data, programs or equipment, and
+unavailability or interruption of operations.
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+EXPORT LAWS: THIS LICENSE ADDS NO RESTRICTIONS TO THE EXPORT LAWS OF
+YOUR JURISDICTION. It is licensee's responsibility to comply with any
+export regulations applicable in licensee's jurisdiction. Under
+CURRENT U.S. export regulations this software is eligible for export
+from the U.S. and can be downloaded by or otherwise exported or
+reexported worldwide EXCEPT to U.S. embargoed destinations which
+include Cuba, Iraq, Libya, North Korea, Iran, Syria, Sudan,
+Afghanistan and any other country to which the U.S. has embargoed
+goods and services.
+
+ ***************************************************************************
+
+For more documentation than found here, see
+
+[1] doc/ReadMe_IMB.txt
+
+[2] Intel(R) MPI Benchmarks
+ Users Guide and Methodology Description
+ In
+ doc/IMB_Users_Guide.pdf
+
+ File: IMB_reduce_scatter_block.c
+
+ Implemented functions:
+
+ IMB_reduce_scatter_block;
+
+ ***************************************************************************/
+
+
+
+
+
+#include "IMB_declare.h"
+#include "IMB_benchmark.h"
+
+#include "IMB_prototypes.h"
+
+/*******************************************************************************/
+
+
+/* ===================================================================== */
+/*
+IMB 3.1 changes
+July 2007
+Hans-Joachim Plum, Intel GmbH
+
+- replace "int n_sample" by iteration scheduling object "ITERATIONS"
+ (see => IMB_benchmark.h)
+
+- proceed with offsets in send / recv buffers to eventually provide
+ out-of-cache data
+*/
+/* ===================================================================== */
+
+void IMB_reduce_scatter_block(struct comm_info* c_info, int size, struct iter_schedule* ITERATIONS,
+ MODES RUN_MODE, double* time) {
+/*
+
+ MPI-1 benchmark kernel
+ Benchmarks MPI_Reduce_scatter_block
+
+Input variables:
+
+-c_info (type struct comm_info*)
+ Collection of all base data for MPI;
+ see [1] for more information
+
+
+-size (type int)
+ Basic message size in bytes
+
+-ITERATIONS (type struct iter_schedule *)
+ Repetition scheduling
+
+-RUN_MODE (type MODES)
+ (only MPI-2 case: see [1])
+
+Output variables:
+
+-time (type double*)
+ Timing result per sample
+
+*/
+ double t1, t2;
+ int i, s_num = 0;
+ size_t pos1, pos2;
+#ifdef CHECK
+ size_t pos;
+ int Locsize;
+#endif
+
+ Type_Size s_size;
+
+#ifdef CHECK
+ defect = 0.;
+#endif
+ ierr = 0;
+
+ /* GET SIZE OF DATA TYPE */
+ MPI_Type_size(c_info->red_data_type, &s_size);
+
+ s_num = size / s_size;
+#ifdef CHECK
+ Locsize = s_size * s_num;
+ pos = Locsize * c_info->rank;
+#endif
+
+ *time = 0.;
+
+ size *= c_info->size_scale;
+ if (c_info->rank != -1) {
+ IMB_do_n_barriers(c_info->communicator, N_BARR);
+
+ for (i = 0; i < ITERATIONS->n_sample; i++) {
+ t1 = MPI_Wtime();
+ ierr = MPI_Reduce_scatter_block((char*)c_info->s_buffer + i % ITERATIONS->s_cache_iter * ITERATIONS->s_offs,
+ (char*)c_info->r_buffer + i % ITERATIONS->r_cache_iter * ITERATIONS->r_offs,
+ s_num, c_info->red_data_type, c_info->op_type, c_info->communicator);
+ MPI_ERRHAND(ierr);
+ t2 = MPI_Wtime();
+ *time += (t2 - t1);
+
+ CHK_DIFF("Reduce_scatter_block", c_info, (char*)c_info->r_buffer + i % ITERATIONS->r_cache_iter * ITERATIONS->r_offs,
+ pos, Locsize, size, asize, put, 0, ITERATIONS->n_sample, i, -1, &defect);
+
+ IMB_do_n_barriers(c_info->communicator, c_info->sync);
+ }
+ *time /= ITERATIONS->n_sample;
+ }
+}
diff --git a/src_cpp/EXT/EXT_suite.cpp b/src_cpp/EXT/EXT_suite.cpp
index cff073b5..9d802d38 100644
--- a/src_cpp/EXT/EXT_suite.cpp
+++ b/src_cpp/EXT/EXT_suite.cpp
@@ -68,6 +68,7 @@ extern "C" {
#include "IMB_benchmark.h"
#include "IMB_comm_info.h"
#include "IMB_prototypes.h"
+extern size_t IMB_buffer_alignment;
}
#include "helper_IMB_functions.h"
@@ -253,6 +254,17 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::
"Default:\n"
"A fixed time limit SECS_PER_SAMPLE =>IMB_settings.h; currently set to 10\n"
"(new default in IMB_3.2)\n");
+ parser.add("aggregate_mode", "multi").set_caption("aggregate_mode").
+ set_description("The argument after -aggregate_mode is a one from possible strings.\n"
+ "Specifying that aggregate_mode will be used: \n"
+ "MODES: aggregate, non_aggregate, multi\n"
+ "aggregate - turn on only AGGREGATE launch\n"
+ "non_aggregate - turn on only NON-AGGREGATE launch\n"
+ "multi - turn on both AGGREGATE and NON-AGGREGATE launches\n"
+ "Example:\n"
+ "-aggregate_mode aggregate\n"
+ "Default:\n"
+ "-aggregate_mode multi\n");
parser.add("mem", 1.0f).
set_caption("max. per process memory for overall message buffers").
set_description(
@@ -301,7 +313,9 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::
"possible argument values are on (1|enable|yes) or off (0|disable|no)\n"
"\n"
"Default:\n"
- "off\n");
+ "off\n");
+ parser.add("alignment", 2097152).set_caption("alignment").
+ set_description("Buffer alignment\n\nDefault:\n2097152\n");
parser.set_default_current_group();
return true;
}
@@ -404,6 +418,13 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, cons
if (given_iter_policy == "multiple_np") { ITERATIONS.iter_policy = imode_multiple_np; }
if (given_iter_policy == "auto") { ITERATIONS.iter_policy = imode_auto; }
+ // aggregate
+ string given_aggregate_mode = parser.get("aggregate_mode");
+ if (given_aggregate_mode == "multi") { c_info.aggregate_mode = AM_TURN_MULTI;}
+ if (given_aggregate_mode == "aggregate") { c_info.aggregate_mode = AM_TURN_ON; }
+ if (given_aggregate_mode == "non_aggregate") { c_info.aggregate_mode = AM_TURN_OFF; }
+ if (c_info.aggregate_mode == AM_ERROR) { c_info.aggregate_mode = AM_TURN_MULTI;}
+
// time
ITERATIONS.secs = parser.get("time");
@@ -449,6 +470,16 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, cons
// imb_barrier
IMB_internal_barrier = (parser.get("imb_barrier") ? 1 : 0);
+ int alignment = parser.get("alignment");
+ if (alignment < sizeof(void*)) {
+ alignment = sizeof(void*);
+ }
+ int power2 = 1;
+ while (power2 < alignment) {
+ power2 *= 2;
+ }
+ IMB_buffer_alignment = power2;
+
if (cmd_line_error)
return false;
diff --git a/src_cpp/IO/IO_suite.cpp b/src_cpp/IO/IO_suite.cpp
index aa426166..23ec70d5 100644
--- a/src_cpp/IO/IO_suite.cpp
+++ b/src_cpp/IO/IO_suite.cpp
@@ -70,6 +70,7 @@ extern "C" {
#include "IMB_comm_info.h"
#include "IMB_prototypes.h"
#include "IMB_declare.h"
+extern size_t IMB_buffer_alignment;
}
#include "helper_IMB_functions.h"
@@ -255,6 +256,17 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::o
"Default:\n"
"A fixed time limit SECS_PER_SAMPLE =>IMB_settings.h; currently set to 10\n"
"(new default in IMB_3.2)\n");
+ parser.add("aggregate_mode", "multi").set_caption("aggregate_mode").
+ set_description("The argument after -aggregate_mode is a one from possible strings.\n"
+ "Specifying that aggregate_mode will be used: \n"
+ "MODES: aggregate, non_aggregate, multi\n"
+ "aggregate - turn on only AGGREGATE launch\n"
+ "non_aggregate - turn on only NON-AGGREGATE launch\n"
+ "multi - turn on both AGGREGATE and NON-AGGREGATE launches\n"
+ "Example:\n"
+ "-aggregate_mode aggregate\n"
+ "Default:\n"
+ "-aggregate_mode multi\n");
parser.add("mem", 1.0f).
set_caption("max. per process memory for overall message buffers").
set_description(
@@ -304,6 +316,8 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::o
"\n"
"Default:\n"
"off\n");
+ parser.add("alignment", 2097152).set_caption("alignment").
+ set_description("Buffer alignment\n\nDefault:\n2097152\n");
parser.set_default_current_group();
return true;
}
@@ -406,6 +420,13 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, const
if (given_iter_policy == "multiple_np") { ITERATIONS.iter_policy = imode_multiple_np; }
if (given_iter_policy == "auto") { ITERATIONS.iter_policy = imode_auto; }
+ // aggregate
+ string given_aggregate_mode = parser.get("aggregate_mode");
+ if (given_aggregate_mode == "multi") { c_info.aggregate_mode = AM_TURN_MULTI;}
+ if (given_aggregate_mode == "aggregate") { c_info.aggregate_mode = AM_TURN_ON; }
+ if (given_aggregate_mode == "non_aggregate") { c_info.aggregate_mode = AM_TURN_OFF; }
+ if (c_info.aggregate_mode == AM_ERROR) { c_info.aggregate_mode = AM_TURN_MULTI;}
+
// time
ITERATIONS.secs = parser.get("time");
@@ -451,6 +472,16 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, const
// imb_barrier
IMB_internal_barrier = (parser.get("imb_barrier") ? 1 : 0);
+ int alignment = parser.get("alignment");
+ if (alignment < sizeof(void*)) {
+ alignment = sizeof(void*);
+ }
+ int power2 = 1;
+ while (power2 < alignment) {
+ power2 *= 2;
+ }
+ IMB_buffer_alignment = power2;
+
if (cmd_line_error)
return false;
diff --git a/src_cpp/MPI1/MPI1_benchmark.cpp b/src_cpp/MPI1/MPI1_benchmark.cpp
index bd4c0704..b1fc9bdd 100644
--- a/src_cpp/MPI1/MPI1_benchmark.cpp
+++ b/src_cpp/MPI1/MPI1_benchmark.cpp
@@ -205,6 +205,16 @@ BENCHMARK(IMB_reduce_scatter, Reduce_scatter)
return true;
}
+BENCHMARK(IMB_reduce_scatter_block, Reduce_scatter_block)
+{
+ descr->flags.insert(DEFAULT);
+ descr->flags.insert(COLLECTIVE);
+ descr->flags.insert(REDUCTION);
+ descr->flags.insert(SENDBUF_SIZE_NP_I);
+ descr->flags.insert(RECVBUF_SIZE_I);
+ return true;
+}
+
BENCHMARK(IMB_allgather, Allgather)
{
descr->flags.insert(DEFAULT);
diff --git a/src_cpp/MPI1/MPI1_suite.cpp b/src_cpp/MPI1/MPI1_suite.cpp
index ef355e4f..7c1ee2c7 100644
--- a/src_cpp/MPI1/MPI1_suite.cpp
+++ b/src_cpp/MPI1/MPI1_suite.cpp
@@ -68,6 +68,7 @@ extern "C" {
#include "IMB_benchmark.h"
#include "IMB_comm_info.h"
#include "IMB_prototypes.h"
+extern size_t IMB_buffer_alignment;
}
#include "helper_IMB_functions.h"
@@ -320,7 +321,7 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std:
set_description(
"The argument after -data_type is a one from possible strings,\n"
"Specifying that type will be used:\n"
- "byte,char,int,float\n"
+ "byte, char, int, float, double\n"
"\n"
"Example:\n"
"-data_type char\n"
@@ -331,7 +332,7 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std:
set_description(
"The argument after -red_data_type is a one from possible strings,\n"
"Specifying that type will be used:\n"
- "char,int,float\n"
+ "char, int, float, double\n"
"\n"
"Example:\n"
"-red_data_type int\n"
@@ -361,6 +362,8 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std:
"\n"
"Default:\n"
"on\n");
+ parser.add("alignment", 2097152).set_caption("alignment").
+ set_description("Buffer alignment\n\nDefault:\n2097152\n");
parser.set_default_current_group();
return true;
}
@@ -389,39 +392,37 @@ void contig_sum(void* in_buf, void* in_out_buf, int* len, MPI_Datatype* datatype
((T*)in_out_buf)[i] += ((T*)in_buf)[i];
}
-MPI_Op get_op(MPI_Datatype type, MPI_Datatype base_type) {
+MPI_Op get_op(MPI_Datatype type) {
MPI_Op op = MPI_SUM;
- if (base_type == MPI_CHAR) {
- MPI_Op_create(&(contig_sum), 1, &op);
- } else {
- if (base_type == MPI_INT) {
- MPI_Op_create(&(contig_sum), 1, &op);
- } else {
- if(base_type == MPI_FLOAT) {
- MPI_Op_create(&(contig_sum), 1, &op);
- }
- }
- }
+ MPI_Datatype mpi_char = MPI_CHAR;
+ MPI_Datatype mpi_int = MPI_INT;
+ MPI_Datatype mpi_float = MPI_FLOAT;
+ MPI_Datatype mpi_double = MPI_DOUBLE;
+ size_t type_size = sizeof(MPI_Datatype);
+
+ if (!memcmp(&type, &mpi_char, type_size)) { MPI_Op_create(&(contig_sum), 1, &op); }
+ else if (!memcmp(&type, &mpi_int, type_size)) { MPI_Op_create(&(contig_sum), 1, &op); }
+ else if (!memcmp(&type, &mpi_float, type_size)) { MPI_Op_create(&(contig_sum), 1, &op); }
+ else if (!memcmp(&type, &mpi_double, type_size)) { MPI_Op_create(&(contig_sum), 1, &op); }
+
return op;
}
string type_to_name(MPI_Datatype type) {
string name = "null";
- if (type == MPI_BYTE) {
- name = "MPI_BYTE";
- } else {
- if (type == MPI_CHAR) {
- name = "MPI_CHAR";
- } else {
- if (type == MPI_INT) {
- name = "MPI_INT";
- } else {
- if (type == MPI_FLOAT) {
- name = "MPI_FLOAT";
- }
- }
- }
- }
+ MPI_Datatype mpi_byte = MPI_BYTE;
+ MPI_Datatype mpi_char = MPI_CHAR;
+ MPI_Datatype mpi_int = MPI_INT;
+ MPI_Datatype mpi_float = MPI_FLOAT;
+ MPI_Datatype mpi_double = MPI_DOUBLE;
+ size_t type_size = sizeof(MPI_Datatype);
+
+ if (!memcmp(&type, &mpi_byte, type_size)) { name = "MPI_BYTE"; }
+ else if (!memcmp(&type, &mpi_char, type_size)) { name = "MPI_CHAR"; }
+ else if (!memcmp(&type, &mpi_int, type_size)) { name = "MPI_INT"; }
+ else if (!memcmp(&type, &mpi_float, type_size)) { name = "MPI_FLOAT"; }
+ else if (!memcmp(&type, &mpi_double, type_size)) { name = "MPI_DOUBLE"; }
+
return name;
}
@@ -579,6 +580,9 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, con
} else if (given_data_type == "float") {
c_info.s_data_type = MPI_FLOAT;
c_info.r_data_type = MPI_FLOAT;
+ } else if (given_data_type == "double") {
+ c_info.s_data_type = MPI_DOUBLE;
+ c_info.r_data_type = MPI_DOUBLE;
} else {
output << "Invalid data_type " << given_data_type << endl;
output << " Set data_type byte" << endl;
@@ -594,6 +598,8 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, con
c_info.red_data_type = MPI_INT;
} else if (given_red_data_type == "float") {
c_info.red_data_type = MPI_FLOAT;
+ } else if (given_red_data_type == "double") {
+ c_info.red_data_type = MPI_DOUBLE;
} else {
output << "Invalid red_data_type " << given_red_data_type << endl;
output << " Set red_data_type float" << endl;
@@ -645,8 +651,18 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, con
c_info.zero_size = 0;
}
+ int alignment = parser.get("alignment");
+ if (alignment < sizeof(void*)) {
+ alignment = sizeof(void*);
+ }
+ int power2 = 1;
+ while (power2 < alignment) {
+ power2 *= 2;
+ }
+ IMB_buffer_alignment = power2;
+
if (c_info.contig_type > 0)
- c_info.op_type = get_op(c_info.red_data_type, base_red_dt);
+ c_info.op_type = get_op(base_red_dt);
if (cmd_line_error)
return false;
diff --git a/src_cpp/MPI1/Makefile.MPI1.mk b/src_cpp/MPI1/Makefile.MPI1.mk
index 9525e100..64a9beb3 100644
--- a/src_cpp/MPI1/Makefile.MPI1.mk
+++ b/src_cpp/MPI1/Makefile.MPI1.mk
@@ -79,6 +79,7 @@ $(C_SRC_DIR)/IMB_pingping.c \
$(C_SRC_DIR)/IMB_pingpong.c \
$(C_SRC_DIR)/IMB_reduce.c \
$(C_SRC_DIR)/IMB_reduce_scatter.c \
+$(C_SRC_DIR)/IMB_reduce_scatter_block.c \
$(C_SRC_DIR)/IMB_scatter.c \
$(C_SRC_DIR)/IMB_scatterv.c \
$(C_SRC_DIR)/IMB_sendrecv.c \
diff --git a/src_cpp/MPI1/Makefile_win.MPI1.mk b/src_cpp/MPI1/Makefile_win.MPI1.mk
index aa9a8a99..0cd4cad2 100644
--- a/src_cpp/MPI1/Makefile_win.MPI1.mk
+++ b/src_cpp/MPI1/Makefile_win.MPI1.mk
@@ -66,6 +66,7 @@ C_OBJ = IMB_declare.obj \
IMB_pingping.obj \
IMB_allreduce.obj \
IMB_reduce_scatter.obj \
+ IMB_reduce_scatter_block.obj \
IMB_reduce.obj \
IMB_exchange.obj \
IMB_bcast.obj \
diff --git a/src_cpp/MT/MT_suite.cpp b/src_cpp/MT/MT_suite.cpp
index 6c3bd384..06df8341 100644
--- a/src_cpp/MT/MT_suite.cpp
+++ b/src_cpp/MT/MT_suite.cpp
@@ -192,9 +192,9 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser,
prepared = true;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0 && !noheader) {
- output << "#---------------------------------------------------------" << std::endl;
- output << "# Intel(R) MPI Benchmarks " << "2019" << ", MT part " << std::endl;
- output << "#---------------------------------------------------------" << std::endl;
+ output << "#------------------------------------------------------------------" << std::endl;
+ output << "# Intel(R) MPI Benchmarks " << "2019 Update 1" << ", MT part " << std::endl;
+ output << "#------------------------------------------------------------------" << std::endl;
output << "#" << std::endl;
}
return true;
diff --git a/src_cpp/NBC/NBC_suite.cpp b/src_cpp/NBC/NBC_suite.cpp
index 5b2db72c..d0754c5c 100644
--- a/src_cpp/NBC/NBC_suite.cpp
+++ b/src_cpp/NBC/NBC_suite.cpp
@@ -68,6 +68,7 @@ extern "C" {
#include "IMB_benchmark.h"
#include "IMB_comm_info.h"
#include "IMB_prototypes.h"
+extern size_t IMB_buffer_alignment;
}
#include "helper_IMB_functions.h"
@@ -315,7 +316,9 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::
"possible argument values are on (1|enable|yes) or off (0|disable|no)\n"
"\n"
"Default:\n"
- "off\n");
+ "off\n");
+ parser.add("alignment", 2097152).set_caption("alignment").
+ set_description("Buffer alignment\n\nDefault:\n2097152\n");
parser.set_default_current_group();
return true;
}
@@ -469,6 +472,16 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, cons
// imb_barrier
IMB_internal_barrier = (parser.get("imb_barrier") ? 1 : 0);
+ int alignment = parser.get("alignment");
+ if (alignment < sizeof(void*)) {
+ alignment = sizeof(void*);
+ }
+ int power2 = 1;
+ while (power2 < alignment) {
+ power2 *= 2;
+ }
+ IMB_buffer_alignment = power2;
+
if (cmd_line_error)
return false;
diff --git a/src_cpp/RMA/RMA_suite.cpp b/src_cpp/RMA/RMA_suite.cpp
index d1bbe72e..05d2363a 100644
--- a/src_cpp/RMA/RMA_suite.cpp
+++ b/src_cpp/RMA/RMA_suite.cpp
@@ -68,6 +68,7 @@ extern "C" {
#include "IMB_benchmark.h"
#include "IMB_comm_info.h"
#include "IMB_prototypes.h"
+extern size_t IMB_buffer_alignment;
}
#include "helper_IMB_functions.h"
@@ -253,6 +254,17 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::
"Default:\n"
"A fixed time limit SECS_PER_SAMPLE =>IMB_settings.h; currently set to 10\n"
"(new default in IMB_3.2)\n");
+ parser.add("aggregate_mode", "multi").set_caption("aggregate_mode").
+ set_description("The argument after -aggregate_mode is a one from possible strings.\n"
+ "Specifying that aggregate_mode will be used: \n"
+ "MODES: aggregate, non_aggregate, multi\n"
+ "aggregate - turn on only AGGREGATE launch\n"
+ "non_aggregate - turn on only NON-AGGREGATE launch\n"
+ "multi - turn on both AGGREGATE and NON-AGGREGATE launches\n"
+ "Example:\n"
+ "-aggregate_mode aggregate\n"
+ "Default:\n"
+ "-aggregate_mode multi\n");
parser.add("mem", 1.0f).
set_caption("max. per process memory for overall message buffers").
set_description(
@@ -316,6 +328,8 @@ template <> bool BenchmarkSuite::declare_args(args_parser &parser, std::
"\n"
"Default:\n"
"off\n");
+ parser.add("alignment", 2097152).set_caption("alignment").
+ set_description("Buffer alignment\n\nDefault:\n2097152\n");
parser.set_default_current_group();
return true;
}
@@ -418,6 +432,13 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, cons
if (given_iter_policy == "multiple_np") { ITERATIONS.iter_policy = imode_multiple_np; }
if (given_iter_policy == "auto") { ITERATIONS.iter_policy = imode_auto; }
+ // aggregate
+ string given_aggregate_mode = parser.get("aggregate_mode");
+ if (given_aggregate_mode == "multi") { c_info.aggregate_mode = AM_TURN_MULTI;}
+ if (given_aggregate_mode == "aggregate") { c_info.aggregate_mode = AM_TURN_ON; }
+ if (given_aggregate_mode == "non_aggregate") { c_info.aggregate_mode = AM_TURN_OFF; }
+ if (c_info.aggregate_mode == AM_ERROR) { c_info.aggregate_mode = AM_TURN_MULTI;}
+
// time
ITERATIONS.secs = parser.get("time");
@@ -469,6 +490,16 @@ template <> bool BenchmarkSuite::prepare(const args_parser &parser, cons
// imb_barrier
IMB_internal_barrier = (parser.get("imb_barrier") ? 1 : 0);
+ int alignment = parser.get("alignment");
+ if (alignment < sizeof(void*)) {
+ alignment = sizeof(void*);
+ }
+ int power2 = 1;
+ while (power2 < alignment) {
+ power2 *= 2;
+ }
+ IMB_buffer_alignment = power2;
+
if (cmd_line_error)
return false;
diff --git a/src_cpp/helpers/helper_IMB_functions.h b/src_cpp/helpers/helper_IMB_functions.h
old mode 100644
new mode 100755
index 0abec1f7..a551d8db
--- a/src_cpp/helpers/helper_IMB_functions.h
+++ b/src_cpp/helpers/helper_IMB_functions.h
@@ -705,6 +705,20 @@ struct Bmark_descr {
void helper_sync_globals_1(comm_info &c_info, GLOBALS &glob, struct Bench *Bmark) {
// NP_min is already initialized by IMB_basic_input
+
+#if (defined EXT || defined MPIIO || RMA)
+ if (Bmark->N_Modes == 2) {
+ int choice_aggregate_mode = c_info.aggregate_mode;
+ if (choice_aggregate_mode == AM_TURN_OFF) {
+ Bmark->N_Modes = 1;
+ Bmark->RUN_MODES[0].AGGREGATE = AM_TURN_OFF;
+ } else if (choice_aggregate_mode == AM_TURN_ON) {
+ Bmark->N_Modes = 1;
+ Bmark->RUN_MODES[0].AGGREGATE = AM_TURN_ON;
+ }
+ }
+#endif
+
glob.ci_np = c_info.w_num_procs;
if (Bmark->RUN_MODES[0].type == ParallelTransferMsgRate) {
glob.ci_np -= glob.ci_np % 2;
diff --git a/src_cpp/imb.cpp b/src_cpp/imb.cpp
index 68534145..8d8b5970 100644
--- a/src_cpp/imb.cpp
+++ b/src_cpp/imb.cpp
@@ -70,7 +70,7 @@ int main(int argc, char * *argv)
bool no_mpi_init_flag = true;
int return_value = 0;
int rank = 0, size = 0;
- const char *program_name = "Intel(R) MPI Benchmarks 2019";
+ const char *program_name = "Intel(R) MPI Benchmarks 2019 Update 1";
std::ostringstream output;
// Some unit tests for args parser
@@ -121,8 +121,8 @@ int main(int argc, char * *argv)
// Extra non-option arguments
parser.set_current_group("EXTRA_ARGS");
parser.add_vector("(benchmarks)", "").set_caption("benchmark[,benchmark,[...]]");
- parser.set_default_current_group();
+ parser.set_default_current_group();
// Now fill in bechmark suite related args
if (!BenchmarkSuitesCollection::declare_args(parser, output)) {