Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ============================================================================
- Name : Hyper.c
- Author :
- Version :
- Copyright : Your copyright notice
- Description : Hello MPI World in C
- ============================================================================
- */
- #include <stdio.h>
- #include <string.h>
- #include "mpi.h"
- int main(int argc, char* argv[]) {
- int my_rank; /* rank of process */
- int p; /* number of processes */
- int source; /* rank of sender */
- int dest; /* rank of receiver */
- int tag = 0; /* tag for messages */
- char message[100]; /* storage for message */
- MPI_Status status; /* return status for receive */
- int m;
- int s, sr;
- int mask;
- /* start up MPI */
- MPI_Init(&argc, &argv);
- /* find out process rank */
- MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
- /* find out number of processes */
- MPI_Comm_size(MPI_COMM_WORLD, &p);
- m = log(p) / log(2);
- int A[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
- mask = 0;
- int i;
- s = A[my_rank];
- for (i = 0; i < m; i++) {
- if ((my_rank & mask) == 0)
- if ((my_rank & (1 << i)) == 0) {
- source = my_rank ^ (1 << i);
- printf("SOURCE: %d\n", source);
- MPI_Recv(&sr, 1, MPI_INT, source, tag, MPI_COMM_WORLD,&status);
- s = s + sr;
- } else {
- dest = my_rank ^ (1 << i);
- printf("DEST: %d\n", dest);
- MPI_Send(&s, 1, MPI_INT, dest, tag, MPI_COMM_WORLD);
- }
- mask = mask ^ (1 << i);
- }
- int j;
- int x=1<<(m-q);
- int sp[];
- for(j=0;j<(1<<(m-q);i++)
- {
- sp[j]=A[j*(1<<q)+id];
- mask=0;
- for(i=0;i<q-1;i++)
- {
- for(j=0;j< x;j++)
- {
- if((id&mask)==0)
- {
- if((id & (1<<i))==0)
- {
- source=id;
- MPI_Recv(&sr, 1, MPI_INT, source, tag, MPI_COMM_WORLD,&status);
- sp[j]=sp[j]+sr;
- }
- else
- {dest = my_rank ^ (1 << i);
- printf("DEST: %d\n", dest);
- MPI_Send(&sp[j], 1, MPI_INT, dest, tag, MPI_COMM_WORLD);
- }
- }
- mask = mask ^ (1 << i);
- }
- }
- }
- /*
- if (my_rank !=0){
- /* create message
- sprintf(message, "Hello MPI World from process %d!", my_rank);
- dest = 0;
- /* use strlen+1 so that '\0' get transmitted
- MPI_Send(message, strlen(message)+1, MPI_CHAR,
- dest, tag, MPI_COMM_WORLD);
- }
- else{
- printf("Hello MPI World From process 0: Num processes: %d\n",p);
- for (source = 1; source < p; source++) {
- MPI_Recv(message, 100, MPI_CHAR, source, tag,
- MPI_COMM_WORLD, &status);
- printf("%s\n",message);
- }
- }*/
- /* shut down MPI */
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement