Difference between revisions of "HPC:Boost"

From HPC wiki
 
(4 intermediate revisions by one other user not shown)
Line 6: Line 6:
  
 
==== Additional versions of Boost ====
 
==== Additional versions of Boost ====
Boost v1.55.0 and v1.57.0 are both available as modules. The example C++ code below can be used to test Boost v1.55.0 and v1.57.0 functionality on the PMACS cluster but '''not''' the system default version.
+
Boost v1.55.0 and v1.57.0 are both available as modules. The example C++ code below can be used to test Boost v1.55.0 and v1.57.0 functionality on the PMACS cluster.
  
Code below has been adapted from the Boost [http://www.boost.org/doc/libs/1_57_0/doc/html/mpi/getting_started.html documentation]
+
Code below has been adapted from the following sources [http://www.boost.org/doc/libs/1_57_0/doc/html/mpi/getting_started.html 1] and [http://particlephysicsandcode.com/ 2]
 
<pre>
 
<pre>
 +
#include <iostream>
 +
#include "boost/mpi.hpp"
  
 +
int main(int argc, char* argv[])
 +
{
 +
  // Allows you to query the MPI environment
 +
  boost::mpi::environment env( argc, argv );
 +
  std::string node_name( env.processor_name() );
 +
 +
  // permits communication and synchronization among a set of processes
 +
  boost::mpi::communicator my_world;
 +
  unsigned int rank( my_world.rank() ), cpu_num( my_world.size() );
 +
 +
  if ( rank == 0 ) {
 +
std::cout << "Node name: " << node_name << "\n";
 +
std::cout << "Master (" << rank << "/" << cpu_num << ")\n";
 +
  } else {
 +
std::cout << "Slave  (" << rank << "/" << cpu_num << ")\n";
 +
  }
 +
  return 0;
 +
}
 
</pre>
 
</pre>
  
Line 16: Line 36:
  
 
===== Boost v1.55.0 =====  
 
===== Boost v1.55.0 =====  
The above code snippet is intended to verify Boost.MPI library functionality. Follow the steps below in an interactive node:
+
The above code snippet is intended to verify Boost.MPI library functionality. Follow the steps below in an interactive node. Launch an interactive session with -n 2 to ensure that the number of processors used in this Boost.MPI test are accounted for
  
 
Load the appropriate Boost version module:
 
Load the appropriate Boost version module:
 
<pre>
 
<pre>
[asrini@consign ~]$ bsub -Is bash
+
[asrini@consign ~]$ bsub -n 2 -Is bash
  
 
[asrini@node062 ~]$ ls boost_test.cpp
 
[asrini@node062 ~]$ ls boost_test.cpp
Line 34: Line 54:
 
<pre>
 
<pre>
  
[asrini@node062 ~]$ mpic++ -W -Wall -L/opt/software/boost/1.55.0/lib/ -lboost_mpi -lboost_serialization -lboost_system -lboost_filesystem -lboost_graph_parallel -lboost_iostreams boost_test.cpp -o Boost
+
[asrini@node062 ~]$ mpic++ -W -Wall -L/opt/software/boost/1.55.0/lib/ -lboost_mpi -lboost_serialization boost_test.cpp -o Boost
  
 
</pre>
 
</pre>
Line 42: Line 62:
 
<pre>
 
<pre>
  
[asrini@node062 ~]$ $ ldd Boost
+
[asrini@node062 ~]$ ldd Boost
linux-vdso.so.1 =>  (0x00007fffebbff000)
+
linux-vdso.so.1 =>  (0x00007fff469bd000)
libboost_mpi.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_mpi.so.1.55.0 (0x00002b69ecb97000)
+
libboost_mpi.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_mpi.so.1.55.0 (0x00002b06dbfc6000)
libboost_serialization.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_serialization.so.1.55.0 (0x00002b69ecdc7000)
+
libboost_serialization.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_serialization.so.1.55.0 (0x00002b06dc1f6000)
libboost_system.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_system.so.1.55.0 (0x00002b69ed041000)
+
libmpi_cxx.so.1 => /usr/lib64/openmpi/lib/libmpi_cxx.so.1 (0x00002b06dc470000)
libboost_filesystem.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_filesystem.so.1.55.0 (0x00002b69ed244000)
+
libmpi.so.1 => /usr/lib64/openmpi/lib/libmpi.so.1 (0x00000031d0e00000)
libboost_graph_parallel.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_graph_parallel.so.1.55.0 (0x00002b69ed45b000)
+
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031cfe00000)
libboost_iostreams.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_iostreams.so.1.55.0 (0x00002b69ed6a3000)
+
libm.so.6 => /lib64/libm.so.6 (0x00000031ce200000)
libmpi_cxx.so.1 => /usr/lib64/openmpi/lib/libmpi_cxx.so.1 (0x00002b69ed8bc000)
+
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000031d0600000)
libmpi.so.1 => /usr/lib64/openmpi/lib/libmpi.so.1 (0x00000030d6800000)
+
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000031cea00000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000030d5400000)
+
libc.so.6 => /lib64/libc.so.6 (0x00000031ce600000)
libm.so.6 => /lib64/libm.so.6 (0x00000030d3800000)
+
librt.so.1 => /lib64/librt.so.1 (0x00000031cf600000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000030d5c00000)
+
libopen-rte.so.7 => /usr/lib64/openmpi/lib/libopen-rte.so.7 (0x00000031d0a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000030d4000000)
+
libopen-pal.so.6 => /usr/lib64/openmpi/lib/libopen-pal.so.6 (0x00000031d0200000)
libc.so.6 => /lib64/libc.so.6 (0x00000030d3c00000)
+
libdl.so.2 => /lib64/libdl.so.2 (0x00000031cee00000)
librt.so.1 => /lib64/librt.so.1 (0x00000030d4c00000)
+
libnsl.so.1 => /lib64/libnsl.so.1 (0x00000031d1600000)
libz.so.1 => /lib64/libz.so.1 (0x00000030d4800000)
+
libutil.so.1 => /lib64/libutil.so.1 (0x00000031d2200000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00000030d8c00000)
+
libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00000031cfa00000)
libopen-rte.so.7 => /usr/lib64/openmpi/lib/libopen-rte.so.7 (0x00000030d6000000)
+
/lib64/ld-linux-x86-64.so.2 (0x00000031cde00000)
libopen-pal.so.6 => /usr/lib64/openmpi/lib/libopen-pal.so.6 (0x00000030d6400000)
+
 
libdl.so.2 => /lib64/libdl.so.2 (0x00000030d4400000)
 
libnsl.so.1 => /lib64/libnsl.so.1 (0x00000030d6c00000)
 
libutil.so.1 => /lib64/libutil.so.1 (0x00000030d7800000)
 
libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00000030d5000000)
 
/lib64/ld-linux-x86-64.so.2 (0x00000030d3400000)
 
 
</pre>
 
</pre>
  
Line 72: Line 87:
  
 
<pre>
 
<pre>
[asrini@node062 ~]$ /Boost
+
 
Processor name: node062.hpc.local
+
[asrini@node062 ~]$ mpirun -np 2 ./Boost
Master (0/1)
+
Node name: node061.hpc.local
 +
Master (0/2)
 +
Slave  (1/2)
 
</pre>
 
</pre>
  
 
===== Boost v1.57.0 =====  
 
===== Boost v1.57.0 =====  
The above code snippet is intended to verify Boost.MPI library functionality. Follow the steps below in an interactive node:
+
The above code snippet is intended to verify Boost.MPI library functionality. Follow the steps below in an interactive node. Launch an interactive session with -n 2 to ensure that the number of processors used in this Boost.MPI test are accounted for
  
 
Load the appropriate Boost version module:
 
Load the appropriate Boost version module:
 
<pre>
 
<pre>
[asrini@consign ~]$ bsub -Is bash
+
[asrini@consign ~]$ bsub -n 2 -Is bash
  
 
[asrini@node062 ~]$ ls boost_test.cpp
 
[asrini@node062 ~]$ ls boost_test.cpp
Line 97: Line 114:
 
<pre>
 
<pre>
  
[asrini@node062 ~]$ mpic++ -W -Wall -L/opt/software/boost/1.57.0/lib/ -lboost_mpi -lboost_serialization -lboost_system -lboost_filesystem -lboost_graph_parallel -lboost_iostreams boost_test.cpp -o Boost
+
[asrini@node062 ~]$ mpic++ -W -Wall -L/opt/software/boost/1.57.0/lib/ -lboost_mpi -lboost_serialization boost_test.cpp -o Boost
  
 
</pre>
 
</pre>
  
Verify that the executable created was indeed compiled against this version of Boost. Notice the path to libboost_mpi.so.1.55.0 in the output below:
+
Verify that the executable created was indeed compiled against this version of Boost. Notice the path to libboost_mpi.so.1.57.0 in the output below:
  
 
<pre>
 
<pre>
  
 
[asrini@node062 ~]$ ldd Boost
 
[asrini@node062 ~]$ ldd Boost
linux-vdso.so.1 =>  (0x00007fff0c9d3000)
+
linux-vdso.so.1 =>  (0x00007fff4e1ff000)
libboost_mpi.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_mpi.so.1.57.0 (0x00002af8847f0000)
+
libboost_mpi.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_mpi.so.1.57.0 (0x00002b55d5d0c000)
libboost_serialization.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_serialization.so.1.57.0 (0x00002af884a20000)
+
libboost_serialization.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_serialization.so.1.57.0 (0x00002b55d5f3c000)
libboost_system.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_system.so.1.57.0 (0x00002af884c8a000)
+
libmpi_cxx.so.1 => /usr/lib64/openmpi/lib/libmpi_cxx.so.1 (0x00002b55d61a6000)
libboost_filesystem.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_filesystem.so.1.57.0 (0x00002af884e8d000)
 
libboost_graph_parallel.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_graph_parallel.so.1.57.0 (0x00002af8850a4000)
 
libboost_iostreams.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_iostreams.so.1.57.0 (0x00002af8852ec000)
 
libmpi_cxx.so.1 => /usr/lib64/openmpi/lib/libmpi_cxx.so.1 (0x00002af885505000)
 
 
libmpi.so.1 => /usr/lib64/openmpi/lib/libmpi.so.1 (0x00000031d0e00000)
 
libmpi.so.1 => /usr/lib64/openmpi/lib/libmpi.so.1 (0x00000031d0e00000)
 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031cfe00000)
 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031cfe00000)
Line 121: Line 134:
 
libc.so.6 => /lib64/libc.so.6 (0x00000031ce600000)
 
libc.so.6 => /lib64/libc.so.6 (0x00000031ce600000)
 
librt.so.1 => /lib64/librt.so.1 (0x00000031cf600000)
 
librt.so.1 => /lib64/librt.so.1 (0x00000031cf600000)
libz.so.1 => /lib64/libz.so.1 (0x00000031cf200000)
 
libbz2.so.1 => /lib64/libbz2.so.1 (0x0000003daea00000)
 
 
libopen-rte.so.7 => /usr/lib64/openmpi/lib/libopen-rte.so.7 (0x00000031d0a00000)
 
libopen-rte.so.7 => /usr/lib64/openmpi/lib/libopen-rte.so.7 (0x00000031d0a00000)
 
libopen-pal.so.6 => /usr/lib64/openmpi/lib/libopen-pal.so.6 (0x00000031d0200000)
 
libopen-pal.so.6 => /usr/lib64/openmpi/lib/libopen-pal.so.6 (0x00000031d0200000)
Line 130: Line 141:
 
libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00000031cfa00000)
 
libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00000031cfa00000)
 
/lib64/ld-linux-x86-64.so.2 (0x00000031cde00000)
 
/lib64/ld-linux-x86-64.so.2 (0x00000031cde00000)
 
 
</pre>
 
</pre>
  
Line 137: Line 147:
 
<pre>  
 
<pre>  
  
[asrini@node062 ~]$ ./Boost
+
[asrini@node062 ~]$ mpirun -np 2 ./Boost
Processor name: node061.hpc.local
+
Node name: node061.hpc.local
Master (0/1)
+
Master (0/2)
 +
Slave  (1/2)
  
 
</pre>
 
</pre>
  
 
=== Other Pages ===
 
=== Other Pages ===
 +
----
 +
<div class="mw-collapsible mw-collapsed">
 +
*[[HPC:FAQ|HPC FAQ ]]
 +
*[[HPC:Login|Connecting to the PMACS cluster]]
 +
*[[HPC:User_Guide|User Guide]]
 
*[[HPC:Software|Available Software]]
 
*[[HPC:Software|Available Software]]
*[[HPC:User_Guide|User Guide]]
+
*[[HPC:Archive System|PMACS Archive System]]
*[[HPC:Main_Page|HPC Main Page]]
+
</div>
*[[HPC:Login|Connecting to the PMACS cluster]]
 

Latest revision as of 15:21, 13 August 2019

Boost

There are currently three different versions of Boost C++ Libraries installed on all the PMACS cluster nodes.

Boost v1.41.0 is the system default version and can be linked to programs without any additional work.
Note : The default version of Boost may not include all the desired libraries. For example MPI library bindings may not work as expected.

Additional versions of Boost

Boost v1.55.0 and v1.57.0 are both available as modules. The example C++ code below can be used to test Boost v1.55.0 and v1.57.0 functionality on the PMACS cluster.

Code below has been adapted from the following sources 1 and 2

#include <iostream>
#include "boost/mpi.hpp"

int main(int argc, char* argv[])
{
  // Allows you to query the MPI environment
  boost::mpi::environment env( argc, argv );
  std::string node_name( env.processor_name() );

  // permits communication and synchronization among a set of processes
  boost::mpi::communicator my_world;
  unsigned int rank( my_world.rank() ), cpu_num( my_world.size() );

  if ( rank == 0 ) {
	std::cout << "Node name: " << node_name << "\n";
	std::cout << "Master (" << rank << "/" << cpu_num << ")\n";
  } else {
	std::cout << "Slave  (" << rank << "/" << cpu_num << ")\n";
  }
  return 0;
}

Copy the code above into a file called boost_test.cpp

Boost v1.55.0

The above code snippet is intended to verify Boost.MPI library functionality. Follow the steps below in an interactive node. Launch an interactive session with -n 2 to ensure that the number of processors used in this Boost.MPI test are accounted for

Load the appropriate Boost version module:

[asrini@consign ~]$ bsub -n 2 -Is bash

[asrini@node062 ~]$ ls boost_test.cpp
boost_test.cpp

[asrini@node062 ~]$ module load openmpi-1.5.4-x86_64

[asrini@node062 ~]$ module load boost-1.55.0

Now compile the code against the version of Boost you are testing.


[asrini@node062 ~]$ mpic++ -W -Wall -L/opt/software/boost/1.55.0/lib/ -lboost_mpi -lboost_serialization boost_test.cpp -o Boost

Verify that the executable created was indeed compiled against this version of Boost. Notice the path to libboost_mpi.so.1.55.0 in the output below:


[asrini@node062 ~]$ ldd Boost
	linux-vdso.so.1 =>  (0x00007fff469bd000)
	libboost_mpi.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_mpi.so.1.55.0 (0x00002b06dbfc6000)
	libboost_serialization.so.1.55.0 => /opt/software/boost/1.55.0/lib/libboost_serialization.so.1.55.0 (0x00002b06dc1f6000)
	libmpi_cxx.so.1 => /usr/lib64/openmpi/lib/libmpi_cxx.so.1 (0x00002b06dc470000)
	libmpi.so.1 => /usr/lib64/openmpi/lib/libmpi.so.1 (0x00000031d0e00000)
	libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031cfe00000)
	libm.so.6 => /lib64/libm.so.6 (0x00000031ce200000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000031d0600000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00000031cea00000)
	libc.so.6 => /lib64/libc.so.6 (0x00000031ce600000)
	librt.so.1 => /lib64/librt.so.1 (0x00000031cf600000)
	libopen-rte.so.7 => /usr/lib64/openmpi/lib/libopen-rte.so.7 (0x00000031d0a00000)
	libopen-pal.so.6 => /usr/lib64/openmpi/lib/libopen-pal.so.6 (0x00000031d0200000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00000031cee00000)
	libnsl.so.1 => /lib64/libnsl.so.1 (0x00000031d1600000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00000031d2200000)
	libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00000031cfa00000)
	/lib64/ld-linux-x86-64.so.2 (0x00000031cde00000)

Test run this program:


[asrini@node062 ~]$ mpirun -np 2 ./Boost
Node name: node061.hpc.local
Master (0/2)
Slave  (1/2)
Boost v1.57.0

The above code snippet is intended to verify Boost.MPI library functionality. Follow the steps below in an interactive node. Launch an interactive session with -n 2 to ensure that the number of processors used in this Boost.MPI test are accounted for

Load the appropriate Boost version module:

[asrini@consign ~]$ bsub -n 2 -Is bash

[asrini@node062 ~]$ ls boost_test.cpp
boost_test.cpp

[asrini@node061 ~]$ module load openmpi-1.5.4-x86_64

[asrini@node061 ~]$ module load boost-1.57.0

Now compile the code against the version of Boost you are testing.


[asrini@node062 ~]$ mpic++ -W -Wall -L/opt/software/boost/1.57.0/lib/ -lboost_mpi -lboost_serialization boost_test.cpp -o Boost

Verify that the executable created was indeed compiled against this version of Boost. Notice the path to libboost_mpi.so.1.57.0 in the output below:


[asrini@node062 ~]$ ldd Boost
	linux-vdso.so.1 =>  (0x00007fff4e1ff000)
	libboost_mpi.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_mpi.so.1.57.0 (0x00002b55d5d0c000)
	libboost_serialization.so.1.57.0 => /opt/software/boost/1.57.0/lib/libboost_serialization.so.1.57.0 (0x00002b55d5f3c000)
	libmpi_cxx.so.1 => /usr/lib64/openmpi/lib/libmpi_cxx.so.1 (0x00002b55d61a6000)
	libmpi.so.1 => /usr/lib64/openmpi/lib/libmpi.so.1 (0x00000031d0e00000)
	libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000031cfe00000)
	libm.so.6 => /lib64/libm.so.6 (0x00000031ce200000)
	libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000031d0600000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00000031cea00000)
	libc.so.6 => /lib64/libc.so.6 (0x00000031ce600000)
	librt.so.1 => /lib64/librt.so.1 (0x00000031cf600000)
	libopen-rte.so.7 => /usr/lib64/openmpi/lib/libopen-rte.so.7 (0x00000031d0a00000)
	libopen-pal.so.6 => /usr/lib64/openmpi/lib/libopen-pal.so.6 (0x00000031d0200000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00000031cee00000)
	libnsl.so.1 => /lib64/libnsl.so.1 (0x00000031d1600000)
	libutil.so.1 => /lib64/libutil.so.1 (0x00000031d2200000)
	libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00000031cfa00000)
	/lib64/ld-linux-x86-64.so.2 (0x00000031cde00000)

Test run this program:

 

[asrini@node062 ~]$ mpirun -np 2 ./Boost
Node name: node061.hpc.local
Master (0/2)
Slave  (1/2)

Other Pages