Skip to content

Commit 9578be1

Browse files
committed
Hybrid Programming
1 parent fb5e9b1 commit 9578be1

File tree

5 files changed

+239
-0
lines changed

5 files changed

+239
-0
lines changed

hybrid_hello.c

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <stdio.h>
2+
#include "mpi.h"
3+
#include "omp.h"
4+
5+
int main (void) {
6+
7+
int rank, tid, size, provided;
8+
9+
MPI_Init_thread(NULL, NULL, MPI_THREAD_FUNNELED, &provided);
10+
11+
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
12+
MPI_Comm_size(MPI_COMM_WORLD, &size);
13+
14+
#pragma omp parallel private(tid)
15+
{
16+
tid = omp_get_thread_num();
17+
printf("Hello from thread %d of process %d\n", tid, rank);
18+
}
19+
20+
MPI_Finalize();
21+
22+
return 0;
23+
24+
}

hybrid_pi.c

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <stdio.h>
2+
#include "mpi.h"
3+
#include "omp.h"
4+
5+
double f( double x ) {
6+
return 4.0 / ( 1.0 + x * x);
7+
}
8+
9+
void printArray(int d[],int n, int r){
10+
int j;
11+
for(j=0;j<n;j++){
12+
printf("rank = %d -----> %d\n",r, d[j]);
13+
}
14+
}
15+
16+
int main(void){
17+
int rank,tid,size,provided;
18+
MPI_Init_thread(NULL,NULL,MPI_THREAD_FUNNELED,&provided);
19+
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
20+
MPI_Comm_size(MPI_COMM_WORLD,&size);
21+
double dizi[3200]={0}, yeniDizi[800]={0};
22+
int i;
23+
if(rank == 0){
24+
for(i=0;i<3200;i++){
25+
dizi[i]=(double)i/3200.0;
26+
}
27+
}
28+
29+
double toplam = 0.0, sonuc = 0.0;
30+
31+
MPI_Scatter(dizi,800,MPI_DOUBLE,yeniDizi,800,MPI_DOUBLE,0,MPI_COMM_WORLD);
32+
33+
#pragma omp parallel shared(toplam) private(i)
34+
{
35+
#pragma omp for schedule(static) reduction(+:toplam)
36+
for(i = 0; i < 800; i++)
37+
toplam += f( yeniDizi[i] );
38+
39+
}
40+
41+
MPI_Reduce( &toplam, &sonuc, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD );
42+
43+
if( rank == 0 ){
44+
printf("Pi = %f\n", sonuc / 3200.0);
45+
}
46+
47+
MPI_Finalize();
48+
return 0;
49+
}

mpi_thread_funneled.c

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <stdio.h>
2+
#include "mpi.h"
3+
#include "omp.h"
4+
5+
void printArray(int d[], int n, int r) {
6+
int j;
7+
for (j = 0; j < n; j++)
8+
printf("rank = %d --> %d\n", r, d[j]);
9+
}
10+
11+
int main (void) {
12+
13+
int rank, tid, size, provided, toplam;
14+
MPI_Status status;
15+
16+
MPI_Init_thread(NULL, NULL, MPI_THREAD_FUNNELED, &provided);
17+
18+
MPI_Comm_size(MPI_COMM_WORLD, &size);
19+
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
20+
21+
int dizi[20] = { 0 };
22+
int i;
23+
24+
if ( rank == 0 ) {
25+
for (i = 0; i < 20; i++)
26+
dizi[i] = i + 1;
27+
}
28+
29+
printArray(dizi, 20, rank);
30+
31+
#pragma omp parallel
32+
{
33+
if (rank == 0) {
34+
#pragma omp master
35+
MPI_Send(dizi, 20, MPI_INT, 1, 777, MPI_COMM_WORLD);
36+
#pragma omp barrier
37+
} else {
38+
#pragma omp master
39+
MPI_Recv(dizi, 20, MPI_INT, 0, 777, MPI_COMM_WORLD, &status);
40+
#pragma omp barrier
41+
}
42+
}
43+
44+
// puts(""); puts("");
45+
// printArray(dizi, 20, rank);
46+
47+
if ( rank == 1 ) {
48+
#pragma omp parallel private(i) shared(toplam)
49+
{
50+
#pragma omp for schedule(static) reduction(+:toplam)
51+
for (i = 0; i < 20; i++)
52+
toplam += dizi[i];
53+
}
54+
55+
printf("Toplam = %d\n", toplam);
56+
}
57+
58+
MPI_Finalize();
59+
60+
return 0;
61+
62+
}

multiple_hybrid.c

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include <stdio.h>
2+
#include "mpi.h"
3+
#include "omp.h"
4+
#define TAG 777
5+
6+
void printArray(int d[], int n, int r) {
7+
int j;
8+
for (j = 0; j < n; j++)
9+
printf("rank = %d --> %d\n", r, d[j]);
10+
}
11+
12+
int main (void) {
13+
14+
int rank, tid, size, provided, toplam;
15+
MPI_Status status;
16+
17+
MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided);
18+
19+
MPI_Comm_size(MPI_COMM_WORLD, &size);
20+
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
21+
22+
int dizi[20] = { 0 };
23+
int yeniDizi[5] = { 0 };
24+
int i;
25+
26+
if ( rank == 0 ) {
27+
for (i = 0; i < 20; i++)
28+
dizi[i] = i + 1;
29+
}
30+
31+
#pragma omp parallel private(tid, i)
32+
{
33+
tid = omp_get_thread_num();
34+
if (rank == 0)
35+
MPI_Send(&dizi[5*tid], 5, MPI_INT, 1, TAG + tid, MPI_COMM_WORLD);
36+
else
37+
MPI_Recv(yeniDizi, 5, MPI_INT, 0, TAG + tid, MPI_COMM_WORLD, &status);
38+
if ( rank == 1 )
39+
for (i = 0; i < 5; i++)
40+
printf("P %d, T %d --> yeniDizi[%d] = %d\n", rank, tid, i, yeniDizi[i]);
41+
}
42+
43+
MPI_Finalize();
44+
45+
return 0;
46+
47+
}
48+
49+
50+
51+

openmp.c

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include <stdio.h>
2+
#include "mpi.h"
3+
#include "omp.h"
4+
#define TAG 777
5+
6+
void printArray(int d[], int n, int r) {
7+
int j;
8+
for (j = 0; j < n; j++)
9+
printf("rank = %d --> %d\n", r, d[j]);
10+
}
11+
12+
int main (void) {
13+
14+
int rank, tid, size, provided, toplam;
15+
MPI_Status status;
16+
17+
MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided);
18+
19+
MPI_Comm_size(MPI_COMM_WORLD, &size);
20+
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
21+
22+
int dizi[20] = { 0 };
23+
int yeniDizi[5] = { 0 };
24+
int i;
25+
26+
if ( rank == 0 ) {
27+
for (i = 0; i < 20; i++)
28+
dizi[i] = i + 1;
29+
}
30+
31+
#pragma omp parallel private(tid, i)
32+
{
33+
tid = omp_get_thread_num();
34+
if (rank == 0)
35+
MPI_Send(&dizi[5*tid], 5, MPI_INT, 1, TAG + tid, MPI_COMM_WORLD);
36+
else
37+
MPI_Recv(yeniDizi, 5, MPI_INT, 0, TAG + tid, MPI_COMM_WORLD, &status);
38+
if ( rank == 1 )
39+
for (i = 0; i < 5; i++)
40+
printf("P %d, T %d --> yeniDizi[%d] = %d\n", rank, tid, i, yeniDizi[i]);
41+
}
42+
43+
MPI_Finalize();
44+
45+
return 0;
46+
47+
}
48+
49+
50+
51+
52+
53+

0 commit comments

Comments
 (0)