`
mintelong
  • 浏览: 392590 次
  • 性别: 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编程手册 写得很详细 都志辉编著 李三立审阅 陈渝刘鹏 校对 本书介绍目前最常见的并行程序—MPI并行程序的设计方法它适合高校三四年级本科 生非计算机专业研究生作为教材和教学自学参考书也适合于广大的...

    mpi库函数简单示例,c中引用mpi

    在Linux环境下,使用配置号的mpi库,实现多进程并发执行。是一个mpi初步小练习。适合初学mpi人练习使用 ****************************************************** ****这里请注意,是在Linux下编译和运行的。编译...

    MPI函数的参考手册

    本附录给出主要MPI函数的参考手册。为了节省篇幅,这里仅列出MPI函数的C接口,Fortran 接口子程序的参数与C 接口函数的参数完全类似。除MPI_Wtime和MPI_Wtick外,Fortran接口子程序比C接口函数在最后多出一个整型...

    MPI与OpenMP并行程序设计(C语言版)美国教授写的

    《MPI与OpenMP并行程序设计(C语言版)》是美国Oregon州立大学的Michael J.Quinn教授在多年讲授“并行程序设计”课程的基础上编写而成的,主要介绍用C语言,并结合使用MPI和OpenMP进行并行程序设计,内容包括并行体系...

    MPI管脚接线图

    MPI各个引脚接线图MPI适配器管脚接线

    Fortran语言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.pdf

    关于MPI、并行计算的总结对比,目录如下: 1. 并行计算 1.1. 相关背景 1.2. 什么是并行计算 1.3. 主要目的 1.4. 并行计算与分布式计算 1.5. 并行的基本条件 1.6. 主要的并行系统 1.6.1. 共享内存模型 1.6.2. 消息...

    S7USB_MPI编程电缆

    USB /MPI (Isolated)Cable 适配器使用说明书 PC Adapter USB V5.3 一、概述 USB/MPI (Isolated) Cable(产品订货号为: 6ES7 972-0CB20-0XA0)适配器实现USB到RS485接口的电平转换和USB到MPI(MultiPoint ...

    mpi_x64.Msi

    mpi安装包

    MPI并行程序设计.pdf

    本书的一个特点是作者在向读者讲解MPI编程技术时采用了大量的编程的实例 对于关键部分还给出了注释使读者能更好地掌握MPI编程的能力而不只是理论知识作 者在这本书的后面部分还介绍了高级和较复杂的MPI并行程序编写...

    MPI接口针脚定义

    MPI接口 针脚 定义,图形表示,不会理解错的,本人整理的

    QT和MPI结合编程

    QT和MPI、结合编程的配置过程。MPI是一个并行消息传递借口,QT用于实现界面编程。

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

    MPI与OpenMP并行程序设计:C语言版

    使用 mpi4py 并行实现粒子 群优化算法_Python_代码_下载

    使用 MPI(通过 mpi4py python 包)使用主从实现模型在多个节点上并行化粒子群优化算法的代码。 被粒子群优化算法最小化的目标函数是 Alpine 1 函数,它通过引入 0.1 秒的暂停而人为地变得昂贵。 设置 并行化的...

    MPI课件(MPI并行程序设计)

    MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)MPI课件(MPI并行程序设计)

    MPI+OpenMP.zip

    并行计算机架构与编程上机实验程序 求矩阵行列式MPI+OpenMP多线程编程 MPI+OpenMP多线程编程的PBS

    并行计算mpi奇偶排序

    运用mpi实现奇偶排序,在不同的处理器之间通过消息传递完成奇偶index的数的交换,实现最终的数列排序

    MPI并行计算源程序及说明

    MPI(Message Passing Interface),消息传递编程接口,是全球工业、科研和政府部联合建立的一个消息传递编程标准。是目前最为通用的并行编程方式。MPI标准中定了一组函数接口,用于进程间的消息传递。函数的具体...

    ubuntu环境下用MPI搭建集群

    ubuntu环境下用MPI搭建集群、环境是ubuntu12.04、史上最详细的配置步骤

    矩阵乘法mpi实现 并行运算

    矩阵乘法mpi实现 并行运算 在linux下成功运行 使用mpicc -o 编译 使用mpirun命令运行

Global site tag (gtag.js) - Google Analytics