Binom_Reduce funktioniert soweit denk ich, ob kommutativität passt bin
ich nicht sicher
This commit is contained in:
commit
265bb2ac36
1 changed files with 78 additions and 0 deletions
78
hpc_mpi/src/hpc_mpi.c
Normal file
78
hpc_mpi/src/hpc_mpi.c
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
============================================================================
|
||||||
|
Name : hpc_mpi.c
|
||||||
|
Author :
|
||||||
|
Version :
|
||||||
|
Copyright : Your copyright notice
|
||||||
|
Description : Hello MPI World in C
|
||||||
|
============================================================================
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "mpi.h"
|
||||||
|
|
||||||
|
int Binom_Reduce(const void *sendbuf, void *recvbuf, int count,
|
||||||
|
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
int my_rank; /* rank of process */
|
||||||
|
int p; /* number of processes */
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
int a = my_rank;
|
||||||
|
int recv;
|
||||||
|
|
||||||
|
Binom_Reduce(&a, &recv, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
|
||||||
|
|
||||||
|
if (my_rank == 0) {
|
||||||
|
printf("%i\n", recv);
|
||||||
|
}
|
||||||
|
/* shut down MPI */
|
||||||
|
MPI_Finalize();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Binom_Reduce(const void *sendbuf, void *recvbuf, int count,
|
||||||
|
MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm) {
|
||||||
|
int r, p, size;
|
||||||
|
MPI_Status status;
|
||||||
|
void *recv;
|
||||||
|
void *reduced;
|
||||||
|
|
||||||
|
MPI_Comm_rank(comm, &r);
|
||||||
|
MPI_Comm_size(comm, &p);
|
||||||
|
MPI_Type_size(datatype, &size);
|
||||||
|
|
||||||
|
MPI_Alloc_mem(count * size, MPI_INFO_NULL, &recv);
|
||||||
|
if (r != root) {
|
||||||
|
MPI_Alloc_mem(count * size, MPI_INFO_NULL, &reduced);
|
||||||
|
} else {
|
||||||
|
reduced = recvbuf;
|
||||||
|
}
|
||||||
|
memcpy(reduced, sendbuf, count * size);
|
||||||
|
|
||||||
|
int i = 1;
|
||||||
|
while ((r + i) % (2 * i) != 0 && i < p) {
|
||||||
|
if (r + i < p) {
|
||||||
|
MPI_Recv(recv, count, datatype, r + i, i, comm, &status);
|
||||||
|
MPI_Reduce_local(recv, reduced, count, datatype, op);
|
||||||
|
}
|
||||||
|
i <<= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r != root) {
|
||||||
|
MPI_Send(reduced, count, datatype, r - i, i, comm);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue