• 大小: 12KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-12
  • 语言: C/C++
  • 标签: MPI  parallel_com  

资源简介

并行计算实验使用MPI计算N体问题代码,命令:mpiexec -n 1 EXP3.exe 64 10 1 g。

资源截图

代码片段和文件信息

// EXP3.cpp : Defines the entry point for the console application.
//

#include “stdafx.h“
#include 
#include 
#include 
#include 
#include 

//#define OUTPUT
//#define DEBUG
#define DIM     2
#define X       0
#define Y       1
typedef double vect_t[DIM];
const double G = 6.67e-11;
int my_rank comm_sz; //进程号 总进程数
MPI_Datatype vect_mpi_t;    //用于发送
MPI_Datatype cyclic_mpi_t;  // 环形传输的数据类型  用于接收
vect_t *vel = NULL;
vect_t *pos = NULL;         // 位置信息变成了全局变量

void Usage(char* prog_name)
{
fprintf(stderr “usage: mpiexec -n  %s\n“ prog_name);
fprintf(stderr “    \n“);
fprintf(stderr “    ‘g‘: inite condition by random\n“);
fprintf(stderr “    ‘i‘: inite condition from stdin\n“);
exit(0);
}

void Get_args(int argc char* argv[] int* n_p int* timestep int* output_freq_p char* g_i_p)
{
if (my_rank == 0)
{
if (argc != 5)
Usage(argv[0]);
*n_p = strtol(argv[1] NULL 10);
*timestep = strtol(argv[2] NULL 10);
*output_freq_p = strtol(argv[3] NULL 10);
*g_i_p = argv[4][0];
if (*n_p <= 0 || *n_p % comm_sz || *timestep < 0 || *g_i_p != ‘g‘ && *g_i_p != ‘i‘)
{
printf(“haha\n“);
if (my_rank == 0)
Usage(argv[0]);
MPI_Finalize();
exit(0);
}
}
MPI_Bcast(n_p 1 MPI_INT 0 MPI_COMM_WORLD);
MPI_Bcast(timestep 1 MPI_INT 0 MPI_COMM_WORLD);
MPI_Bcast(output_freq_p 1 MPI_INT 0 MPI_COMM_WORLD);
MPI_Bcast(g_i_p 1 MPI_CHAR 0 MPI_COMM_WORLD);
#   ifdef DEBUG
printf(“Get_args rank%2d n %d n_steps %d output_freq %d g_i %c\n“
my_rank *n_p *timestep *output_freq_p *g_i_p);
fflush(stdout);
#   endif
}

void Build_cyclic_mpi_type(int loc_n)// 生成大小为 loc_n 的循环分配数据类型
{
MPI_Datatype temp_mpi_t;
MPI_Aint lb extent;
MPI_Type_vector(loc_n 1 comm_sz vect_mpi_t &temp_mpi_t);// 将跨度为 comm_sz 的 loc_n 个 “连续 2 个 double”  封装为 temp_mpi_t
MPI_Type_get_extent(vect_mpi_t &lb &extent);
MPI_Type_create_resized(temp_mpi_t lb extent &cyclic_mpi_t);
MPI_Type_commit(&cyclic_mpi_t);
}

void Gen_init_cond(double masses[] vect_t loc_pos[] vect_t loc_vel[] int n int loc_n)
{
const double mass = 1.0e4 gap = 1.0e-2 speed = 0;
if (my_rank == 0)
{
// srand(2);
for (int i = 0; i < n; i++)
{
masses[i] = mass;
pos[i][X] = i * gap;
pos[i][Y] = 0.0;

vel[i][X] = 0.0;
// vel[i][Y] = speed * (2 * rand() / (double)RAND_MAX) - 1);
vel[i][Y] = (i % 2) ? -speed : speed;
}
}
MPI_Bcast(masses n MPI_DOUBLE 0 MPI_COMM_WORLD);//从一个序列号为root的进程将一条消息广播发送到组内的所有进程这里是将n体初始化信息广播
MPI_Scatter(pos 1 cyclic_mpi_t loc_pos loc_n vect_mpi_t 0 MPI_COMM_WORLD);// loc_pos 和 loc_vel 需要分别分发
MPI_Scatter(vel 1 cyclic_mpi_t loc_vel loc_n vect_mpi_t 0 MPI_COMM_WORLD);//每个进程获取自己的loc_pos和loc_vel
#   ifdef DEBUG
printf(“Gen_init_cond rank%2d mase[0]%10.3e posX%10.3e posY%10.3e velX%10.3e v

评论

共有 条评论