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)) {