`
mintelong
  • 浏览: 396147 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MPI

阅读更多
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define WORD_LENGTH 256  

typedef struct wordNode wordNode;
struct wordNode
{
    char word[WORD_LENGTH];               
    int iWordCount;            
wordNode *pNext;           
};

wordNode * map();
wordNode * reduce(wordNode * wordNode1,wordNode * wordNode2);


main( argc, argv )
int argc;
char **argv;
{
char word1[1024];
char word2[1024];
int wordcount1=0;
int wordcount2=0;
int myrank;
wordNode * pHeader1;
wordNode * pHeader2;
int count1=0;
int count2=0;
MPI_Status status;
MPI_Init(&argc, &argv );

MPI_Comm_rank(MPI_COMM_WORLD, &myrank );


if (myrank == 0)
{
pHeader1 = map();

wordNode * pH1;
pH1=pHeader1;

while(pH1!=NULL){
count1++;
pH1=pH1->pNext;
}

MPI_Send(&count1,1,MPI_INT,2,99,MPI_COMM_WORLD);

while(pHeader1!=NULL){
strcpy(word1,pHeader1->word);
wordcount1=pHeader1->iWordCount;
MPI_Send(word1, 32, MPI_CHAR,2,99,MPI_COMM_WORLD);
MPI_Send(&wordcount1,1,MPI_INT,2,99,MPI_COMM_WORLD);
pHeader1=pHeader1->pNext;
}


}else if(myrank==1)
{
pHeader2 = map();

wordNode * pH2;
pH2=pHeader2;

while(pH2!=NULL){
count2++;
pH2=pH2->pNext;
}

MPI_Send(&count2,1,MPI_INT,2,99,MPI_COMM_WORLD);

while(pHeader2!=NULL){
strcpy(word2,pHeader2->word);
wordcount2=(int)(pHeader2->iWordCount);
MPI_Send(word2, 32, MPI_CHAR,2,99,MPI_COMM_WORLD);
MPI_Send(&wordcount2, 1, MPI_INT,2,99,MPI_COMM_WORLD);
pHeader2=pHeader2->pNext;
}

}
else if(myrank==2)
{
int i=0;
int j=0;
wordNode * p1=(wordNode*)malloc(sizeof(wordNode));
wordNode * p2=(wordNode*)malloc(sizeof(wordNode));

wordNode * p1_return;
wordNode * p2_return;
p1_return=p1;
p2_return=p2;

MPI_Recv(&count1, 1, MPI_INT, 0, 99, MPI_COMM_WORLD,&status);
printf("******received********* :  %d\n", count1);
MPI_Recv(&count2, 1, MPI_INT, 1, 99, MPI_COMM_WORLD,&status);
printf("******received********* :  %d\n", count2);


while(i<count1){
MPI_Recv(word1, 32, MPI_CHAR, 0, 99, MPI_COMM_WORLD,&status);
MPI_Recv(&wordcount1, 1, MPI_INT, 0, 99, MPI_COMM_WORLD,&status);

printf("received from node01:  %s\n", word1);
printf("received from node01:  %d\n", wordcount1);

wordNode * tmp_p = (wordNode*)malloc(sizeof(wordNode));
strcpy(p1->word,word1);
p1->iWordCount=wordcount1;
                                //pp=p1;  //return pp;
p1->pNext=tmp_p;
p1=tmp_p;
i++;
}

/*
while(p1_return->pNext!=NULL){
printf("\n");
printf("=================================\n");
printf("received :  %s\n", p1_return->word);
printf("received :  %d\n", p1_return->iWordCount);
printf("=================================\n");
printf("\n");
p1_return=p1_return->pNext;
}
*/


while(j<count2){
MPI_Recv(word2, 32, MPI_CHAR, 1, 99, MPI_COMM_WORLD,&status);
MPI_Recv(&wordcount2, 1, MPI_INT, 1, 99, MPI_COMM_WORLD,&status);

printf("received from node02:  %s\n", word2);
printf("received from node02:  %d\n", wordcount2);

wordNode * tmp_p02 = (wordNode*)malloc(sizeof(wordNode));
strcpy(p2->word,word2);
p2->iWordCount=wordcount2;
p2->pNext=tmp_p02;
p2=tmp_p02;
j++;
}

/*
while(p2_return->pNext!=NULL){
printf("\n");
printf("=================================\n");
printf("received :  %s\n", p2_return->word);
printf("received :  %d\n", p2_return->iWordCount);
printf("=================================\n");
printf("\n");
p2_return=p2_return->pNext;
}
*/




wordNode * pHeader = reduce(p1_return,p2_return);


while(pHeader!=NULL){
printf("\n");
printf("=================================\n");
printf("received :  %s\n", pHeader->word);
printf("received :  %d\n", pHeader->iWordCount);
printf("=================================\n");
printf("\n");
pHeader=pHeader->pNext;
}


}

MPI_Finalize();
}



wordNode * map(){
wordNode *pHeader = NULL; 
    char temp[WORD_LENGTH];

    //打开要读取的文件
    FILE *fp;
    if( NULL == (fp=fopen("123.txt", "r")) )  
    {
        printf("Open file failed!!\n");
        exit(1);
    }

    //循环读取文本中的内容
    while( EOF != (fscanf(fp,"%s",temp)) )
    {
        //CountWord(temp);
wordNode *pNode = NULL;

   if( NULL == pHeader)
{
pHeader = (wordNode*)malloc(sizeof(wordNode));
strcpy(pHeader->word, temp);
pHeader->iWordCount = 0;
pHeader->pNext = NULL;
pNode = pHeader;
}

//搜索现有的链表
   else{
wordNode *pCurr = pHeader;
wordNode *pPre = NULL;
while( (NULL != pCurr) && (0 != strcmp(pCurr->word, temp)) )
{
pPre = pCurr;
pCurr = pCurr->pNext;
}

//该单词不存在
if(NULL == pCurr)
{
pCurr = (wordNode*)malloc(sizeof(wordNode));
strcpy(pCurr->word, temp);
pCurr->iWordCount = 0;
pCurr->pNext = NULL;
pPre->pNext = pCurr;
}
pNode = pCurr;
   }

if(NULL == pNode)
{
continue;
}
else
{
pNode->iWordCount++;
}
}

    return pHeader;
}




wordNode * reduce(wordNode * wordNode1,wordNode * wordNode2){

wordNode * temp1 = NULL;
wordNode * temp2 = NULL;
if(wordNode1 == NULL){
return wordNode2;
}
else{
temp1 = wordNode1;
temp2 = wordNode2;
while(temp1 != NULL){

int flag=0;
while(temp2!= NULL)
{
if(strcmp(temp1->word, temp2->word)==0){
   temp2->iWordCount += temp1->iWordCount;
                   flag=1;
   break;
}
else
temp2 = temp2->pNext;
                       }

if(!flag){
        wordNode *dd = (wordNode*)malloc(sizeof(wordNode));
strcpy(dd->word, temp1->word);
dd->iWordCount=temp1->iWordCount;
dd->pNext = NULL;
temp2->pNext = dd;
   }

         temp2 = wordNode2;
temp1 = temp1->pNext;
}

}

return temp2;

}




分享到:
评论

相关推荐

    MPI管脚接线图

    MPI(Multi-Programmed Input/Output)是一种通信协议,主要用于西门子的S7系列PLC(可编程逻辑控制器)之间以及PLC与上位机的通信。在工业自动化领域,MPI接口允许设备进行数据交换,实现网络化控制。本文将详细...

    MPI的环境搭建C++编程

    这个程序中,`MPI_Init`启动MPI环境,`MPI_Comm_rank`获取当前进程的ID(rank),`MPI_Comm_size`得到总进程数,最后`MPI_Finalize`结束MPI环境。 **五、并行算法** MPI可用于实现各种并行算法,如矩阵乘法、求解...

    MPI for Python Manual

    ### MPI for Python Manual #### 一、引言与概述 **MPI for Python** 是一个用于 Python 编程语言的消息传递接口 (MPI) 的绑定库,它由 Lisandro Dalcín 开发并发布于 2009 年 12 月 29 日。该文档介绍了 MPI for...

    MPI与OpenMP并行程序设计:C语言版,mpi和openmp混合编程,C,C++

    在C语言中,MPI提供了一系列的函数调用,如`MPI_Init()`用于初始化MPI环境,`MPI_Comm_rank()`获取当前进程的ID,`MPI_Send()`和`MPI_Recv()`实现数据发送和接收。理解这些基本操作是掌握MPI编程的基础。 OpenMP,...

    西门子MPI线缆驱动

    西门子MPI(Multi-Point Interface)是一种通信协议,它被广泛应用于西门子的SIMATIC S7-300和S7-400系列PLC(可编程逻辑控制器)中,允许PLC与其他设备如编程设备、人机界面(HMI)、其他PLC或者上位机进行数据交换...

    并行的matlab——matlabMPI

    4. **MPI通信原语**:MATLABMPI暴露了MPI通信原语,如`mpi.send`和`mpi.recv`,使得可以直接使用低级别通信操作。这些函数可以实现进程间的数据传输,比如点对点的消息传递、广播和集合通信。 5. **并行数组和...

    MPI:消息传递接口标准3.0版英文版

    ### MPI:消息传递接口标准3.0版 #### 核心知识点概述 1. **MPI标准的历史演变**:从最初的MPI-1.0版本到MPI-3.0版本的逐步发展。 2. **MPI标准的主要内容**:包括点对点通信、集体通信、组和通信器概念、进程拓扑...

    MPI实现直方图统计

    标题中的“MPI实现直方图统计”涉及到分布式计算和数据处理的重要概念,即Message Passing Interface (MPI)。MPI是用于并行计算的标准库,它允许程序员在多处理器系统或者计算机集群上编写并行程序。在这个场景中,...

    如何在ubuntu上设置MPI运行环境

    ### 如何在Ubuntu上设置MPI运行环境 #### 并行计算与MPI简介 在现代高性能计算(HPC)领域,并行计算技术变得越来越重要。它能够显著提高计算密集型任务的处理速度,尤其是在多核处理器架构下。消息传递接口(MPI...

    用MPI计算PI的值

    在分布式计算领域,MPI(Message Passing Interface)是一种广泛使用的编程接口,用于构建并行应用程序。本文将深入探讨如何使用MPI来计算圆周率π的值,这是一个经典的并行计算问题,有助于初学者理解MPI的基本原理...

    MPI奇偶排序源代码+可运行程序

    源代码文件中,开发者可能会用到MPI的关键函数,如`MPI_Init`来初始化MPI环境,`MPI_Comm_rank`获取进程ID,`MPI_Send`和`MPI_Recv`进行进程间通信,以及`MPI_Finalize`关闭MPI环境等。 综上所述,这个资源包提供了...

    Win7-64位系统-Vs2010下安装和配置MPI

    ### Win7-64位系统下Vs2010中安装和配置MPI #### 前提条件 - 操作系统版本:Windows 7 64位 - 开发环境:Visual Studio 2010 #### MPI简介 消息传递接口(Message Passing Interface, MPI)是一种用于编写并行计算...

    MPI并行程序设计

    ### MPI并行程序设计知识点概览 #### 一、并行程序设计基础 - **并行计算机分类**:并行计算机可以根据指令与数据流、存储方式等进行分类。 - **指令与数据流**:根据指令与数据流的不同,可以分为SISD(单指令流...

    MPI与OpenMP并行程序设计

    《MPI与OpenMP并行程序设计》是一本深入探讨并行计算领域中两种主流技术——Message Passing Interface(MPI)和OpenMP的书籍。并行计算是解决大规模计算问题的关键技术,尤其是在高性能计算、数据分析和机器学习等...

    MPI.zip_linux mpi

    标题"MPI.zip_linux mpi"暗示了这是一个关于MPI(Message Passing Interface)的教程,专门针对Linux操作系统。MPI是分布式计算环境中的一种通信库,用于在多处理器系统或计算机集群上进行并行计算。"Linux"指的是这...

    mpi官方文档 mpi-report.pdf

    MPI,全称Message Passing Interface,是并行计算领域的一个重要标准,用于分布式内存系统中的进程间通信。MPI规范定义了一套函数接口,使得程序员可以编写跨平台、高性能的并行程序。这份“mpi官方文档”提供了MPI...

    mpi与openmp并行程序设计ppt

    1. "mpi9.ppt" 和其他MPI相关的PPT可能包含对MPI基本概念、通信模式和同步机制的讲解,以及如何编写和运行MPI程序的实例。 2. "第12章 线性方程组.ppt" 可能深入讨论了如何使用并行算法解决大型线性方程组,这是...

    基于MPI的并行计算实现Jacobi迭代

    ### 基于MPI的并行计算实现Jacobi迭代 #### 概述 本文主要讨论了如何使用消息传递接口(Message Passing Interface, MPI)来实现并行计算中的Jacobi迭代法。Jacobi迭代法是一种广泛应用于求解线性方程组的数值方法...

    MPI+OpenMP.zip

    《MPI+OpenMP并行计算详解》 在现代高性能计算领域,为了充分利用多核处理器以及分布式计算资源,MPI(Message Passing Interface)和OpenMP已成为并行编程的两大主流技术。本资料“MPI+OpenMP.zip”包含了一个针对...

    mpi fft mpi fft

    从给定的文件信息来看,讨论的主题是关于在并行计算环境下使用MPI(Message Passing Interface)实现快速傅里叶变换(FFT)。以下是对这一主题的深入解析与扩展: ### MPI与FFT结合的意义 FFT是一种高效的算法,...

Global site tag (gtag.js) - Google Analytics