MPI实现并行计算统计数据

给定一个数据文件data.txt,存放有N个整型数据(测试数据为13个,1-13),要求统计素数个数。

#include "mpi.h"
#include <stdio.h>
#include <math.h>
#define SIZE 10000

int isPrime(int num){
    if(num<2){
        return 0;
    }else if(num==2 || num==3){
        return 1;
    }else{
        int primeFlag=1;
        for(int i=2;i<(int)sqrt(num)+1;i++){
            if(num%i==0){
                primeFlag=0;
                break;
            }
        }
        return primeFlag;
    }
}

int main(int argc,char* argv[]) {
    int number[SIZE];
    FILE *fp=fopen("data.txt","r");
    if(fp==NULL) {
        printf("can not open data.txt!\n");
    } else {
        int totalNum=0;
        while(!feof(fp)) {
            if(totalNum<SIZE-1) {
                int num=0;
                fscanf(fp,"%d",&num);
                num?number[totalNum++]=num:0;
            } else {
                break;
            }
        }
        int rank,size;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        if(rank==0){
            int result=0;
            int total=0;
            for(int i=1;i<size;i++){
                MPI_Recv(&result,sizeof(int),MPI_INT,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
                total+=result;
            }
            printf("total number:%d\n",total);
        }else{
            int start=totalNum/(size-1)*(rank-1);
            int tail=(rank==(size-1))?totalNum-1:start+totalNum/(size-1)-1;
            int mySize=0;
            for(int i=start;i<=tail;i++){
                printf("[rank %d] judge number:%d\n",rank,number[i]);
                mySize=isPrime(number[i])?mySize+1:mySize;
            }
            printf("[rank %d]total prime number:%d\n",rank,mySize);
            MPI_Send(&mySize,sizeof(int),MPI_INT,0,0,MPI_COMM_WORLD);
        }
        MPI_Finalize();
    }
    return 0;
}

执行编译命令:

mpicc prime_test.cpp -lm -o prime_test

注意-lm参数表示需要链接数学库,编译环境为mpich2-1.0.2p1 + ubuntu14.04 b4bit

然后执行:

mpiexec  -n 4 ./prime_test

运行截图如下:

时间: 2024-07-31 02:07:14

MPI实现并行计算统计数据的相关文章

栅格重分类和条件函数均可以实现对流量统计数据进行定义划分

ArcGIS水分分析工具的流向分析是基于D8单流向算法,如果分析使用的DEM存在凹陷点,就会产生汇,导致径流断流从而影响了分析结果.在前面章节<ArcGIS水文分析实战教程(2)ArcGIS水文分析工具的基本原理>中又介绍过D8算法,而<ArcGIS水文分析实战教程(4)地形预处理>章节中笔者也较少过如何创建无凹陷点得DEM数据,在使用流向分析工具之前可以先行阅读. 首先流向分析要使用填洼过的数据,确保DEM数据没有凹陷点.如果数据准备妥当,直接使用水文分析工具箱中的[流向]工具进

Pandas日期数据处理:如何按日期筛选、显示及统计数据

前言 pandas有着强大的日期数据处理功能,本期我们来了解下pandas处理日期数据的一些基本功能,主要包括以下三个方面: 按日期筛选数据 按日期显示数据 按日期统计数据 运行环境为 windows系统,64位,python3.5. 1 读取并整理数据 首先引入pandas库 import pandas as pd 从csv文件中读取数据 df = pd.read_csv('date.csv', header=None) print(df.head(2)) 0 1 0 2013-10-24 3

基于MPI的并行计算—矩阵向量乘

以前没接触过MPI编程,对并行计算也没什么了解.朋友的期末课程作业让我帮忙写一写,哎,实现结果很一般啊.最终也没完整完成任务,惭愧惭愧. 问题大概是利用MPI完成矩阵和向量相乘.输入:Am×n,Bn×1  ,输出:Cm×1 附:程序中定义m=400,n=100,矩阵和向量的取值为随意整型数,为了便于显示并行效果,循环完成该计算任务100000次. 实现过程 1.实验环境:WINDOWS8.1 64位+ MPICH + VS2013   / kubuntu 14.04 + mpich 2.解题思路

统计数据的陷阱

[统计数据的陷阱] 1.有编译数据显示,在铀矿工作的工人居然与其他人的寿命相当,有时甚至更长!难道编译结果表明在铀矿工作对身体无害么? 事实上,只有那些身强体壮的人才会去铀矿工作,他们的寿命本来就工一些. 2.有数据表明打太极拳的人和不打太极拳的人平均寿命相同. 事实上,打太极拳的人往往是体弱多病的人. 3.编译数据表明,冰淇淋销量增加,鲨鱼食人事件也会同时增加.难道把冰淇淋的销售点全部取缔了,就能减小人被鲨鱼吃掉的概率? 事实上,这2个变量同时增加只不过是因为夏天来了. 4.有数据表明,足球人

LBS数据分析:使用地图展示统计数据——麻点图与麻数图

作为一个LBS的APP,都获得了用户经纬度,也都使用了友盟统计.google ana等等统计分析系统,不过没有地图展示功能,不能进行直观的展示. 友盟统计.google ana等系统是总体数据统计,无法和业务结合起来,比如淘宝提供每个店.每个商品的用户统计. 当有上述需求时,就需要自己服务器保存一份经纬度,进行统计,这时候如何直观的展示? 查看各个地图开放平台的文档,发现有的提供了“麻点图/点聚合(Marker Cluster)”功能. 原理是:把每个点都画在地图上,缩放时累加聚合. 缺点:只能

统计数据方面SQL与HQL

因为HQL是面向对象的,所以对于统计数据方面使用HQL时不合适的,其实HQL最终还是会转化成SQL语句,项目里使用HQL语句应该是为了标准规范化. 统计的数据:同一个表,同一个字段,不同属性,统计不同属性的记录数: 例如:有一个房间表格,如图所示: 现在我要做的是统计各种房间可用的数量分别是多少. 但是这个对于HQL语句是运行不同的,所以在DaoImp层,使用了查询SQL 另外:说明一下对于List无法直接调用属性的话,例如(#list.name,#list.password) 对于使用iter

Python+Mysql生成zabbix统计数据

先大概了解一下zabbix数据库结构: 1.groups表 可以根据组名查到组ID 2.找到组ID就可以根据组ID找出这个组下面的所有服务器的ID,这个关系在hosts_groups表里面: 3.有了hostid就可以在hosts表里查看这台机器的基本信息了: items表则可以根据hostid查出这台服务器的所有监控项: 4.终于在items表查到itemid,利用这个itemid在trends和trends_uint这两个表中统计出我们需要的数据 我python水平挺菜的,很多面向对象的功能

MySql按周/月/日分组统计数据的方法

知识关键词:DATE_FORMAT select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks; select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days; select DATE_FORMAT(create_time,'%Y%m') month

MySql 按周/月/日统计数据的方法

知识关键词:DATE_FORMAT select DATE_FORMAT(create_time,'%Y%u') weeks,count(caseid) count from tc_case group by weeks; select DATE_FORMAT(create_time,'%Y%m%d') days,count(caseid) count from tc_case group by days; select DATE_FORMAT(create_time,'%Y%m') month