-
大小: 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
- 上一篇:64位的GDIPLUS库
- 下一篇:数据结构--家谱管理系统内含报告
相关资源
- 生命游戏MPI并行实现
- 矩阵转置的并行算法mpi实现
- 基于MPI的PSRS算法的实现
- LL(1)文法判断Compilation principle
- Jumping the Queue C++代码
- 基于MPI-GA的TSP问题C++代码
- iar.cc++.compiler.v1.30.3.50673.for.rl78-patch
- Intel C++ Compiler 9 10 11 license Key 注册文
- c 编译器 masm32 汇编 可自举
- MPI并行化多体问题源码
- StateMachineCompiler for C 根据状态表生成
- mingW-w64 C++ compiler
- Intel C++ Compiler 11.1.054 windows (包含安
- 高性能计算之并行编程技术-MPI并行程
- 共轭梯度法求解偏微分方程MPI并行的
- 并行计算mpi奇偶排序
- 2 维热传导 (Heat distribution) 基于M
- 矩阵相乘的MPI 并行计算程序Fortran
- MPI并行程序设计都志辉-C源程序
评论
共有 条评论