mpi
2024-09-02 14:24:48
使用MPI,计算cos x 函数的积分值,积分区间为(0,2PI)
这里写图片描述
基本思路:
把积分区间,分为相等若干块(此处起多少个线程,分多少块),每个线程分得一块积分区域,每块在分若干小块(此处定义分10块)。每个线程计算每个小块的面积之和,返回给0号线程。
所得,即为cos(x )在积分域上的值。
代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<math.h>
#include"mpi.h"
#define PI 3.1415
int main(int argc,char** argv)
{
int rank,p,i; //
double* sbuf; //
double rbuf[];
double add; // double h; //
int a; //
double sum ; //
double* ssum;
double asum ;
int n=;
//初始化
MPI_Init(&argc,&argv);
//从命令行获取开启的线程数
MPI_Comm_size(MPI_COMM_WORLD,&p);
//获取本线程的线程号
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
add= (*PI)/p;
if(rank==)
{
ssum=(double*)malloc(sizeof(double)*p);
sbuf=(double*)malloc(sizeof(double)*p); printf("Process's begin x is ");
for(i=;i<p;i++)
{
//计算各块起始x
sbuf[i]=add*(i);
printf(" %lf ",sbuf[i]);
}
printf("\n");
}
//向各个线程分发起始x值
MPI_Scatter(sbuf,,MPI_DOUBLE,rbuf,,MPI_DOUBLE,,MPI_COMM_WORLD); h=(add)/n;
for(i=;i<n;i++)
{
double x=rbuf[]+h*i+h/;
sum=sum+cos(x)*h;
}
printf("Process %d 's sum is %.2lf\n",rank,sum);
//收集各线程计算结果
MPI_Gather(&sum,,MPI_DOUBLE,ssum,,MPI_DOUBLE,,MPI_COMM_WORLD);
if(rank==)
{
for(i=;i<p;i++)
{ asum=asum+ssum[i];
}
printf("cos x 0~2PI de ji fen shi %.2lf\n",asum);
}
MPI_Finalize();
return ;
}
程序主要是通过计算出各个积分域块的起始x值,向各个线程分发,这样各个线程就可以负责一个单独的积分域。
代码很简单,很容易看懂。
结果:
---------------------
作者:热血小码哥
来源:CSDN
原文:https://blog.csdn.net/mmayanshuo/article/details/72853324
版权声明:本文为博主原创文章,转载请附上博文链接!
最新文章
- Myeclipse添加外部Tomcat出现启动故障的问题解决
- [Eclipse]解决: Eclipse Maven “Add Dependency”搜索无结果
- cannot use the same dataset for report.dataset and page.dataset
- ABBYY有哪些图像处理选项
- 使用VPN服务器解决公司不能上淘宝的问题
- 字符串转json
- Matlab求范数
- svn的merge使用例子
- android 设置字体颜色、EditText自己主动输入转换成大写字母的多种方式
- Linux查看文件夹大小du
- Oracle中 Instr 这个函数
- 框架学习笔记之Mybatis(一)
- 浅谈java中内置的观察者模式与动态代理的实现
- DEDE整站动态/静态转换
- JS for循环 if判断、white循环。小练习二
- Error:java: Compilation failed: internal java compiler error 解决办法
- 打造SharePoint之在线开发神器SPOnlineDevelopTool(一)——概述
- mpvue——引入antv-F2图表
- python 全栈开发,Day69(Django的视图层,Django的模板层)
- C++11之auto和decltype