-
Notifications
You must be signed in to change notification settings - Fork 0
/
main3d.c
62 lines (51 loc) · 1.75 KB
/
main3d.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <mpi.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define N 1000000
struct Point
{
int x;
int y;
int z;
};
typedef struct Point Point; //memberikan nama lain/alias kepada Point yang sudah dibuat sebelumnya
int main(int argc, char ** argv) //deklarasi bahwa bagian ini sampai MPI_Finalize() menggunakan MPI
{
int rank, size, i, j;
clock_t startTime, endTime;
double waktulewat;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank); //jumlah proses yang digunakan dari executor/server
long jumlahlokal[3] = {0L,0L,0L}; //long integer value dengan semua nilai dijadikan 0 pada awal
long jumlahtotal[3] = {0L,0L,0L}; //long integer value dengan semua nilai dijadikan 0 pada awal
int tugas = N/size;
Point * arr;
int start = tugas*rank;
int end = start+tugas;
startTime = clock();
arr = (Point *) malloc(tugas*sizeof(Point));
for( i = start, j= 0; i < end; i++,j++)
{
arr[j].x = i+1;
arr[j].y = i+2;
arr[j].z = i+3;
}
for( i = 0; i < tugas; i++)
{
jumlahlokal[0] += arr[i].x;
jumlahlokal[1] += arr[i].y;
jumlahlokal[2] += arr[i].z;
}
MPI_Reduce(&jumlahlokal, &jumlahtotal, 3, MPI_LONG, MPI_SUM, 0, MPI_COMM_WORLD);
endTime = clock();
waktulewat = ((double)endTime - startTime) / CLOCKS_PER_SEC; //karena ingin menjadi satuan detik maka dibagi CLOCKS_PER_SEC
printf("Waktu yang dibutuhkan: %d : %f detik\n", rank, waktulewat);
free((void *) arr);
if(rank == 0)
printf("The sum is x = %ld, y = %ld, z = %ld\n", jumlahtotal[0], jumlahtotal[1], jumlahtotal[2]);
MPI_Finalize(); // proses dengan mpi selesai
return 0;
}