选择排序的MPI实现

#include "stdafx.h"
#include "mpi.h"
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include "stdlib.h"
#define SIZE 2//进程数
const int ARRAY_SIZE = 100000/SIZE;//每个进程分配的个数
int shuzu[SIZE][ARRAY_SIZE];
int zonghanshu[SIZE][ARRAY_SIZE];
double endwtime;
double startwtime;
void swap(int *a, int *b);
int main(int argc, char *argv[]){
    int myid;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &myid);

    int numtasks;
    srand(10086);
    for (int i = 0; i < SIZE; i++){
        for (int j = 0; j < ARRAY_SIZE; j++){
            shuzu[i][j] = rand();
        }
    }

    int xiaopaixu[ARRAY_SIZE];

    startwtime = MPI_Wtime();
    MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
    if (numtasks == SIZE){
        MPI_Scatter(shuzu, ARRAY_SIZE, MPI_INT, xiaopaixu, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD);



        for (int i = 0; i <ARRAY_SIZE; i++){
            for (int j = i + 1;j < ARRAY_SIZE ;  j++){
                if (xiaopaixu[i] > xiaopaixu[j]){
                    swap(&xiaopaixu[i],&xiaopaixu[j]);

                }
            }
        }

        MPI_Gather(xiaopaixu, ARRAY_SIZE, MPI_INT, zonghanshu, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD);

        int time[SIZE];
        for (int i = 0; i < SIZE; i++){
            time[i] = 0;
        }
        int a[SIZE];
        int zongpaixu2[ARRAY_SIZE*SIZE];
        for (int j = ARRAY_SIZE*SIZE - 1; j >= 0; j--){
            for (int k = 0; k < SIZE; k++){
                if (time[k] >= ARRAY_SIZE){
                    a[k] = 0;
                }
                else
                {
                    a[k] = zonghanshu[k][ARRAY_SIZE - time[k] - 1];
                }
            }

            int x = a[0];
            for (int i = 1; i<SIZE; i++){
                if (a[i]>x){
                    x = a[i];
                }
            }
            for (int n = 0; n < SIZE; n++){
                if (x == a[n]){
                    time[n] = time[n] + 1;
                    break;
                }
            }

            zongpaixu2[j] = x;
        }

        endwtime = MPI_Wtime();

        if (myid);
        else
            for (int i = 0; i < SIZE*ARRAY_SIZE; i++){
                printf("%d ", zongpaixu2[i]);
            }

    }

    if (myid);
    else
        printf("\ntime=%f\n", endwtime - startwtime);
    MPI_Finalize();


}

void swap(int *a, int *b)
{
    int  c;
    c = *a;
    *a = *b;
    *b =  c;
}

posted on 2017-01-16 14:55  让编程成为一种习惯  阅读(307)  评论(0编辑  收藏  举报