用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

芙蓉妹妹    -  云代码空间

——

每个进程含一个随机数,计算这个数字在所有数组中的排名

2019-04-20|1012阅||

摘要:for(i = 0; i< size - 1; i++) for(j = 0;j < size-1-i ; j++){ if(arr[j].val < arr[j+1].val){

#include <stdio.h>
#include <time.h>
#include "mpi.h"
#include <malloc.h>
#include <stdlib.h>

typedef struct data{
    int val;
    int rank;
}DATA;

int main(int argc, char ** argv){
    int rank,size,num,order,*rbuf,i,j;
    DATA *arr;
    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(comm, &size);
    MPI_Comm_rank(comm, &rank);

    srand((int)time(NULL) + rank);
    num = rand() % 66;
    if(rank == 0){
        rbuf = (int*)malloc(sizeof(int)*size);
        arr = (DATA*)malloc(sizeof(DATA)*size);
    }
    MPI_Gather(&num,1,MPI_INT,rbuf,1,MPI_INT,0,comm);
    if(rank == 0){
        for(i = 0;i < size; i++){
            arr[i].val = rbuf[i];
            arr[i].rank = i;
        }
        DATA mid;
        for(i = 0; i< size - 1; i++)
            for(j = 0;j < size-1-i ; j++){
            if(arr[j].val < arr[j+1].val){
                mid.val = arr[j].val;
                mid.rank = arr[j].rank;
                arr[j].val = arr[j + 1].val;
                arr[j].rank = arr[j + 1].rank;
                arr[j + 1].val = mid.val;
                arr[j + 1].rank = mid.rank;
            }
        }
        for(i = 0; i< size; i++){
            for(j = 0; j < size; j++){
                if(arr[j].rank == i)
                    rbuf[i] = j;
            }
        }
    }
    MPI_Scatter(rbuf,1,MPI_INT,&order,1,MPI_INT,0,comm);
    printf("Process %d: my num is %d ,order is %d.\n",rank,num,order);

    if(rank == 0){
        free(rbuf);
        free(arr);
    }
    MPI_Barrier(comm);
    MPI_Finalize();
    return 0;
} 

冒泡排序:i和j的范围要牢记

for(i = 0; i< size - 1; i++)
            for(j = 0;j < size-1-i ; j++){
            if(arr[j].val < arr[j+1].val){
                mid.val = arr[j].val;
                mid.rank = arr[j].rank;
                arr[j].val = arr[j + 1].val;
                arr[j].rank = arr[j + 1].rank;
                arr[j + 1].val = mid.val;
                arr[j + 1].rank = mid.rank;
            }
        }
等所有的进程都运行完,在结束整个函数:
MPI_Barrier(comm);

顶 2踩 2收藏
文章评论
    发表评论

    个人资料

    • 昵称: 芙蓉妹妹
    • 等级: 资深程序员
    • 积分: 1710
    • 代码: 104 个
    • 文章: 25 篇
    • 随想: 0 条
    • 访问: 32 次
    • 关注

    标签

    最新提问

      站长推荐