资源简介
使用c++语言编写的MPI并行优化N-body问题源码,测试可用。适用于刚开始接触并行计算解决基本问题的人,可作为参考。
代码片段和文件信息
//mpi_nbody_basic.c,MPI 基本算法
#include
#include
#include
#include
#include
#define OUTPUT // 要求输出结果
#define DEBUG // debug 模式,每个函数给出更多的输出
#define DIM 2 // 二维系统
#define X 0 // X 坐标
#define Y 1 // Y 坐标
typedef double vect_t[DIM]; // 向量数据类型
const double G = 6.673e-11; // 万有引力常量
int my_rank comm_sz; // 进程编号和总进程数
MPI_Datatype vect_mpi_t; // 使用的派生数据类型
vect_t *vel = NULL; // 全局颗粒速度,用于 0 号进程的输出
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* n_steps_p double* delta_t_p int* output_freq_p char* g_i_p)// 获取参数信息
{ // 所有进程均调用该函数,因为有集合通信,但只有 0 号进程处理参数
if (my_rank == 0)
{
if (argc != 6)
Usage(argv[0]);
*n_p = strtol(argv[1] NULL 10);
*n_steps_p = strtol(argv[2] NULL 10);
*delta_t_p = strtod(argv[3] NULL);
*output_freq_p = strtol(argv[4] NULL 10);
*g_i_p = argv[5][0];
if (*n_p <= 0 || *n_p % comm_sz || *n_steps_p < 0 || *delta_t_p <= 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(n_steps_p 1 MPI_INT 0 MPI_COMM_WORLD);
MPI_Bcast(delta_t_p 1 MPI_DOUBLE 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 delta_t %e output_freq %d g_i %c\n“
my_rank *n_p *n_steps_p *delta_t_p *output_freq_p *g_i_p);
fflush(stdout);
# endif
}
void Gen_init_cond(double masses[] vect_t pos[] vect_t loc_vel[] int n int loc_n)// 自动生成初始条件,所有进程均调用该函数,因为有集合通信
{ // 生成的颗粒位于原点和 X 正半轴,速度大小相等,方向平行于 Y 轴,交错向上下
const double mass = 5.0e24 gap = 1.0e5 speed = 3.0e4;// 使用了地球的质量和公转速度
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);
MPI_Bcast(pos n vect_mpi_t 0 MPI_COMM_WORLD);
MPI_Scatter(vel loc_n vect_mpi_t loc_vel loc_n vect_mpi_t 0 MPI_COMM_W
- 上一篇:三子连珠游戏VC++程序
- 下一篇:图像相似度比较
相关资源
- 基于MFC的多媒体音频播放器
- C/C++语言图像处理:各种滤波
- LKA_MPC.slx
- c++ bmp位图修改读取头文件
- compass.tar.gz
- compat-libstdc++-33-3.2.3-47.3.i386离线安装包
- MFC数字图像处理BMP格式读取 保存 DF
- compat-libstdc++-33-3.2.3(x86_64)
- MPPT算法.rar
- 中国移动通信CMPP2.0短消息网关开发接
- compat-libstdc++-33-3.2.3-61.x86_64.rpm
- C++11标准完整版ISO+IEC+14882C11;标准
- C++ 生成Dump文件
- StateMachineCompiler for C 根据状态表生成
- 《Qt 5.9 C++开发指南》第2.4节 混合方式
- mingW-w64 C++ compiler
- Intel C++ Compiler 11.1.054 windows (包含安
- compat-libstdc++-33-3.2.3-61.i386.rpm
- compat-libstdc++-33-3.2.3-72.el7.x86_64.rpm
- C语言中文网资料.rar
- SM2SM3;SM4;国密算法的C语言实现.rar
- SEH异常捕获类,生成dump文件
- C中如何显示bmp文件,教你C语言编程的
- STM32驱动TMP75 C语言程序
- C++程序基础课程设计——求取平均分
- stc15w单片机mpr121触摸按键
- An implementation of the ISO-TP (ISO15765-2)
- STM32控制MPU6050六轴传感器源码
- Operating Systems Design and Implementation Th
- 高性能计算之并行编程技术-MPI并行程
评论
共有 条评论