#include<mpi.h>
#include<omp.h>
#include<stdio.h>
#include<stdlib.h>
#define TOTAL_AT_RANK 10
int main(int argc, char **argv) {
int i, my_max, total_max;
int rank, np;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &np);
printf("procs = %d and rank = %d\n",np
, rank
);
int* array
= (int*) malloc(sizeof(int) * np
* TOTAL_AT_RANK
);
int arr_sz = np * TOTAL_AT_RANK;
int start_index = TOTAL_AT_RANK * rank;
int end_index = start_index + TOTAL_AT_RANK;
if(rank == 0) {
for(i=0; i<arr_sz; i++) {
array[i] = i;
}
}
MPI_Bcast(array, arr_sz, MPI_INT, 0, MPI_COMM_WORLD);
my_max= 0;
#pragma omp parallel for default(shared) private(i) reduction(max:my_max)
for(i=start_index; i<end_index; i++) {
if(my_max < array[i]){
my_max = array[i];
}
}
printf("process %d my_max = %d\n",rank
, my_max
); MPI_Reduce(&my_max, &total_max, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD);
//Verify the result at root
if(rank == 0) {
int expected = 0;
for(i=0; i<np * TOTAL_AT_RANK; i++) {
if(expected < array[i]){
expected = array[i];
}
}
if(total_max
== expected
) printf("0: Test SUCCESS\n"); else printf("0: Test FAILED\n"); printf("expected = %d and total_max = %d\n",expected
, total_max
); }
MPI_Finalize();
return 0;
}
I2luY2x1ZGU8bXBpLmg+CiNpbmNsdWRlPG9tcC5oPgojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxzdGRsaWIuaD4KI2RlZmluZSBUT1RBTF9BVF9SQU5LIDEwCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICBpbnQgaSwgbXlfbWF4LCB0b3RhbF9tYXg7CiAgaW50IHJhbmssIG5wOwogIE1QSV9Jbml0KCZhcmdjLCAmYXJndik7CiAgTVBJX0NvbW1fcmFuayhNUElfQ09NTV9XT1JMRCwgJnJhbmspOwogIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZucCk7CgogIHByaW50ZigicHJvY3MgPSAlZCBhbmQgcmFuayA9ICVkXG4iLG5wLCByYW5rKTsKCiAgaW50KiBhcnJheSA9IChpbnQqKSBtYWxsb2Moc2l6ZW9mKGludCkgKiBucCAqIFRPVEFMX0FUX1JBTkspOwoKICBpbnQgYXJyX3N6ID0gbnAgKiBUT1RBTF9BVF9SQU5LOwogIGludCBzdGFydF9pbmRleCA9IFRPVEFMX0FUX1JBTksgKiByYW5rOwogIGludCBlbmRfaW5kZXggPSBzdGFydF9pbmRleCArIFRPVEFMX0FUX1JBTks7CiAgIGlmKHJhbmsgPT0gMCkgewogIGZvcihpPTA7IGk8YXJyX3N6OyBpKyspIHsKICAgIGFycmF5W2ldID0gaTsKICB9CiAgIH0KICBNUElfQmNhc3QoYXJyYXksIGFycl9zeiwgTVBJX0lOVCwgMCwgTVBJX0NPTU1fV09STEQpOwogIG15X21heD0gMDsKICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgZGVmYXVsdChzaGFyZWQpIHByaXZhdGUoaSkgcmVkdWN0aW9uKG1heDpteV9tYXgpCiAgZm9yKGk9c3RhcnRfaW5kZXg7IGk8ZW5kX2luZGV4OyBpKyspIHsKICAgIGlmKG15X21heCA8IGFycmF5W2ldKXsKICAgICAgbXlfbWF4ID0gYXJyYXlbaV07CiAgICB9CiAgfQogIHByaW50ZigicHJvY2VzcyAlZCBteV9tYXggPSAlZFxuIixyYW5rLCBteV9tYXgpOwogIE1QSV9SZWR1Y2UoJm15X21heCwgJnRvdGFsX21heCwgMSwgTVBJX0lOVCwgTVBJX01BWCwgMCwgTVBJX0NPTU1fV09STEQpOwoKICAvL1ZlcmlmeSB0aGUgcmVzdWx0IGF0IHJvb3QKICBpZihyYW5rID09IDApIHsKICAgIGludCBleHBlY3RlZCA9IDA7CiAgICBmb3IoaT0wOyBpPG5wICogVE9UQUxfQVRfUkFOSzsgaSsrKSB7CiAgICBpZihleHBlY3RlZCA8IGFycmF5W2ldKXsKICAgICAgZXhwZWN0ZWQgPSBhcnJheVtpXTsKICAgIH0KICAgIH0KICAgIGlmKHRvdGFsX21heCA9PSBleHBlY3RlZCkgcHJpbnRmKCIwOiBUZXN0IFNVQ0NFU1NcbiIpOwogICAgZWxzZSBwcmludGYoIjA6IFRlc3QgRkFJTEVEXG4iKTsKICAgIHByaW50ZigiZXhwZWN0ZWQgPSAlZCBhbmQgdG90YWxfbWF4ICA9ICVkXG4iLGV4cGVjdGVkLCB0b3RhbF9tYXggKTsKICB9CgogIGZyZWUoYXJyYXkpOwogIE1QSV9GaW5hbGl6ZSgpOwogIHJldHVybiAwOwp9