我是在集群环境中运行的MPI的新手。我想在ssh进入群集上的节点并加载相关的MPI模块(即mpi / openmpi-x86_64)之后尝试此示例代码。 mpiCC和mpi ++命令均不起作用,并因此产生以下错误。我是否要在包含部分中丢失某些东西,还是需要加载另一个软件包?
编辑:这不是一个简单的声明,因为使用相同的类型来替换多个MPI函数的返回值。
# include <cmath>
# include <cstdlib>
# include <ctime>
# include <iomanip>
# include <iostream>
# include <mpi.h>
using namespace std;
int main ( int argc, char *argv[] );
int prime_number ( int n, int id, int p );
void timestamp ( );
//****************************************************************************80
int main ( int argc, char *argv[] )
//****************************************************************************80
//
// Purpose:
//
// MAIN is the main program for PRIME_MPI.
//
// Discussion:
//
// This program calls a version of PRIME_NUMBER that includes
// MPI calls for parallel processing.
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 16 June 2016
//
// Author:
//
// John Burkardt
//
{
int i;
int id;
int n;
int n_factor;
int n_hi;
int n_lo;
int p;
int primes;
int primes_part;
double wtime;
n_lo = 1;
n_hi = 262144;
n_factor = 2;
//
// Initialize MPI.
//
ierr = MPI_Init ( &argc, &argv );
//
// Get the number of processes.
//
ierr = MPI_Comm_size ( MPI_COMM_WORLD, &p );
//
// Determine this processes's rank.
//
ierr = MPI_Comm_rank ( MPI_COMM_WORLD, &id );
if ( id == 0 )
{
timestamp ( );
cout << "\n";
cout << "PRIME_MPI\n";
cout << " C++/MPI version\n";
cout << "\n";
cout << " An MPI example program to count the number of primes.\n";
cout << " The number of processes is " << p << "\n";
cout << "\n";
cout << " N Pi Time\n";
cout << "\n";
}
n = n_lo;
while ( n <= n_hi )
{
if ( id == 0 )
{
wtime = MPI_Wtime ( );
}
ierr = MPI_Bcast ( &n, 1, MPI_INT, 0, MPI_COMM_WORLD );
primes_part = prime_number ( n, id, p );
ierr = MPI_Reduce ( &primes_part, &primes, 1, MPI_INT, MPI_SUM, 0,
MPI_COMM_WORLD );
if ( id == 0 )
{
wtime = MPI_Wtime ( ) - wtime;
cout << " " << setw(8) << n
<< " " << setw(8) << primes
<< " " << setw(14) << wtime << "\n";
}
n = n * n_factor;
}
//
// Terminate MPI.
//
MPI_Finalize ( );
//
// Terminate.
//
if ( id == 0 )
{
cout << "\n";
cout << "PRIME_MPI - Master process:\n";
cout << " Normal end of execution.\n";
cout << "\n";
timestamp ( );
}
return 0;
}
//****************************************************************************80
int prime_number ( int n, int id, int p )
//****************************************************************************80
//
// Purpose:
//
// PRIME_NUMBER returns the number of primes between 1 and N.
//
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 21 May 2009
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// Input, int N, the maximum number to check.
//
// Input, int ID, the ID of this process,
// between 0 and P-1.
//
// Input, int P, the number of processes.
//
// Output, int PRIME_NUMBER, the number of prime numbers up to N.
//
{
int i;
int j;
int prime;
int total;
total = 0;
for ( i = 2 + id; i <= n; i = i + p )
{
prime = 1;
for ( j = 2; j < i; j++ )
{
if ( ( i % j ) == 0 )
{
prime = 0;
break;
}
}
total = total + prime;
}
return total;
}
//****************************************************************************80
void timestamp ( )
//****************************************************************************80
//
// Purpose:
//
// TIMESTAMP prints the current YMDHMS date as a time stamp.
//
// Example:
//
// 31 May 2001 09:45:54 AM
//
// Licensing:
//
// This code is distributed under the GNU LGPL license.
//
// Modified:
//
// 24 September 2003
//
// Author:
//
// John Burkardt
//
// Parameters:
//
// None
//
{
# define TIME_SIZE 40
static char time_buffer[TIME_SIZE];
const struct tm *tm;
size_t len;
time_t now;
now = time ( NULL );
tm = localtime ( &now );
len = strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm );
cout << time_buffer << "\n";
return;
# undef TIME_SIZE
}