#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并行程序的设计方法它适合高校三四年级本科 生非计算机专业研究生作为教材和教学自学参考书也适合于广大的...
在Linux环境下,使用配置号的mpi库,实现多进程并发执行。是一个mpi初步小练习。适合初学mpi人练习使用 ****************************************************** ****这里请注意,是在Linux下编译和运行的。编译...
本附录给出主要MPI函数的参考手册。为了节省篇幅,这里仅列出MPI函数的C接口,Fortran 接口子程序的参数与C 接口函数的参数完全类似。除MPI_Wtime和MPI_Wtick外,Fortran接口子程序比C接口函数在最后多出一个整型...
《MPI与OpenMP并行程序设计(C语言版)》是美国Oregon州立大学的Michael J.Quinn教授在多年讲授“并行程序设计”课程的基础上编写而成的,主要介绍用C语言,并结合使用MPI和OpenMP进行并行程序设计,内容包括并行体系...
MPI各个引脚接线图MPI适配器管脚接线
此文档描述了Fortran上mpi的使用。 Fortran語言 1 MPI 平行計算程式設計 1 第一章 前言 5 1.1 MPI 平行計算軟體 6 1.2 國家高速網路與計算中心的平行計算環境 7 1.3 在IBM 電腦系統上如何使用MPI 8 1.3.1 IBM 電腦...
关于MPI、并行计算的总结对比,目录如下: 1. 并行计算 1.1. 相关背景 1.2. 什么是并行计算 1.3. 主要目的 1.4. 并行计算与分布式计算 1.5. 并行的基本条件 1.6. 主要的并行系统 1.6.1. 共享内存模型 1.6.2. 消息...
USB /MPI (Isolated)Cable 适配器使用说明书 PC Adapter USB V5.3 一、概述 USB/MPI (Isolated) Cable(产品订货号为: 6ES7 972-0CB20-0XA0)适配器实现USB到RS485接口的电平转换和USB到MPI(MultiPoint ...
mpi安装包
本书的一个特点是作者在向读者讲解MPI编程技术时采用了大量的编程的实例 对于关键部分还给出了注释使读者能更好地掌握MPI编程的能力而不只是理论知识作 者在这本书的后面部分还介绍了高级和较复杂的MPI并行程序编写...
MPI接口 针脚 定义,图形表示,不会理解错的,本人整理的
QT和MPI、结合编程的配置过程。MPI是一个并行消息传递借口,QT用于实现界面编程。
MPI与OpenMP并行程序设计:C语言版
使用 MPI(通过 mpi4py python 包)使用主从实现模型在多个节点上并行化粒子群优化算法的代码。 被粒子群优化算法最小化的目标函数是 Alpine 1 函数,它通过引入 0.1 秒的暂停而人为地变得昂贵。 设置 并行化的...
MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)
并行计算机架构与编程上机实验程序 求矩阵行列式MPI+OpenMP多线程编程 MPI+OpenMP多线程编程的PBS
运用mpi实现奇偶排序,在不同的处理器之间通过消息传递完成奇偶index的数的交换,实现最终的数列排序
MPI(Message Passing Interface),消息传递编程接口,是全球工业、科研和政府部联合建立的一个消息传递编程标准。是目前最为通用的并行编程方式。MPI标准中定了一组函数接口,用于进程间的消息传递。函数的具体...
ubuntu环境下用MPI搭建集群、环境是ubuntu12.04、史上最详细的配置步骤
矩阵乘法mpi实现 并行运算 在linux下成功运行 使用mpicc -o 编译 使用mpirun命令运行