Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9b86401

Browse files
OpenMP version
1 parent 8a5659b commit 9b86401

File tree

22 files changed

+922
-0
lines changed

22 files changed

+922
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
all:
2+
gcc -fopenmp argmax.c -lm -o argmax
488 KB
Binary file not shown.
23.1 KB
Binary file not shown.
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
#include <stdlib.h>
2+
#include <stdio.h>
3+
#include <math.h>
4+
#include <omp.h>
5+
6+
void initialize(double *v, int N) {
7+
for (int i = 0; i < N; i++) {
8+
v[i] = (1 - pow(0.5 - (double)i/(double)N, 2)) * cos(2*M_PI*100* (i - 0.5)/N);
9+
}
10+
}
11+
12+
void argmax_par(double *v, int N, double *m, int *idx_m) {
13+
14+
*m = -1.;
15+
*idx_m = -1;
16+
17+
#pragma omp parallel for shared(m, idx_m)
18+
for (int i = 0; i < N; i++) {
19+
#pragma omp critical
20+
if (v[i] > *m) {
21+
*m = v[i];
22+
*idx_m = i;
23+
}
24+
}
25+
}
26+
27+
28+
void argmax_seq(double *v, int N, double *m, int *idx_m) {
29+
30+
*m = -1.;
31+
*idx_m = -1;
32+
33+
for (int i = 0; i < N; i++) {
34+
if (v[i] > *m) {
35+
*m = v[i];
36+
*idx_m = i;
37+
}
38+
}
39+
}
40+
41+
void argmax_recursive(double *v, int N, double *m, int *idx_m, int K) {
42+
43+
if (N <= K) {
44+
argmax_seq(v, N, m, idx_m);
45+
return;
46+
}
47+
48+
double ml, mr;
49+
int idx_ml, idx_mr;
50+
51+
argmax_recursive(v, N/2, &ml, &idx_ml, K);
52+
argmax_recursive(v + N/2, N/2, &mr, &idx_mr, K);
53+
54+
if (mr >= ml) {
55+
*m = mr;
56+
*idx_m = idx_mr + N/2;
57+
}
58+
else {
59+
*m = ml;
60+
*idx_m = idx_ml;
61+
}
62+
return;
63+
}
64+
65+
void argmax_recursive_tasks(double *v, int N, double *m, int *idx_m, int K) {
66+
67+
if (N <= K) {
68+
argmax_seq(v, N, m, idx_m);
69+
return;
70+
}
71+
72+
double ml, mr;
73+
int idx_ml, idx_mr;
74+
75+
#pragma omp task shared(ml, idx_ml)
76+
argmax_recursive_tasks(v, N/2, &ml, &idx_ml, K);
77+
78+
#pragma omp task shared(mr, idx_mr)
79+
argmax_recursive_tasks(v + N/2, N/2, &mr, &idx_mr, K);
80+
81+
#pragma omp taskwait
82+
83+
if (mr >= ml) {
84+
*m = mr;
85+
*idx_m = idx_mr + N/2;
86+
}
87+
else {
88+
*m = ml;
89+
*idx_m = idx_ml;
90+
}
91+
return;
92+
}
93+
94+
int main(int argc, char * argv[])
95+
{
96+
int N = 4096*4096;
97+
int K = (argc == 2) ? atoi(argv[1]) : 512;
98+
99+
printf("Running argmax with K = %d\n", K);
100+
101+
double *v = (double *)malloc(N*sizeof(double));
102+
103+
double t_start, t_end;
104+
105+
initialize(v, N);
106+
107+
t_start = omp_get_wtime();
108+
double seq_m;
109+
int seq_idx_m;
110+
argmax_seq(v, N, &seq_m, &seq_idx_m);
111+
t_end = omp_get_wtime();
112+
printf("sequential for argmax: m = %5.2f, idx=%d, time=%fs\n", seq_m, seq_idx_m, t_end - t_start);
113+
114+
t_start = omp_get_wtime();
115+
double par_m;
116+
int par_idx_m;
117+
argmax_par(v, N, &par_m, &par_idx_m);
118+
t_end = omp_get_wtime();
119+
printf("parallel for argmax: m = %5.2f, idx=%d, time=%fs\n", par_m, par_idx_m, t_end - t_start);
120+
121+
t_start = omp_get_wtime();
122+
double rec_m;
123+
int rec_idx_m;
124+
argmax_recursive(v, N, &rec_m, &rec_idx_m, K);
125+
t_end = omp_get_wtime();
126+
printf("sequential recursive argmax: m = %5.2f, idx=%d, time=%fs\n", rec_m, rec_idx_m, t_end - t_start);
127+
128+
t_start = omp_get_wtime();
129+
double task_m;
130+
int task_idx_m;
131+
#pragma omp parallel
132+
#pragma omp single
133+
argmax_recursive_tasks(v, N, &task_m, &task_idx_m, K);
134+
t_end = omp_get_wtime();
135+
printf("parallel recursive argmax: m = %5.2f, idx=%d, time=%fs\n", task_m, task_idx_m, t_end - t_start);
136+
137+
free(v);
138+
return 0;
139+
}

‎OpenMP-Cholesky_Histograms_Argmax/Argmax/job.err

Whitespace-only changes.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
gcc -fopenmp argmax.c -lm -o argmax
2+
Running argmax with K = 1
3+
sequential for argmax: m = 1.00, idx=8388608, time=0.018033s
4+
parallel for argmax: m = 1.00, idx=8388608, time=0.882080s
5+
sequential recursive argmax: m = 1.00, idx=8388608, time=0.171807s
6+
parallel recursive argmax: m = 1.00, idx=8388608, time=11.736740s
7+
Running argmax with K = 128
8+
sequential for argmax: m = 1.00, idx=8388608, time=0.018055s
9+
parallel for argmax: m = 1.00, idx=8388608, time=1.050966s
10+
sequential recursive argmax: m = 1.00, idx=8388608, time=0.027947s
11+
parallel recursive argmax: m = 1.00, idx=8388608, time=0.062163s
12+
Running argmax with K = 512
13+
sequential for argmax: m = 1.00, idx=8388608, time=0.018047s
14+
parallel for argmax: m = 1.00, idx=8388608, time=1.008227s
15+
sequential recursive argmax: m = 1.00, idx=8388608, time=0.026505s
16+
parallel recursive argmax: m = 1.00, idx=8388608, time=0.017224s
17+
Running argmax with K = 1024
18+
sequential for argmax: m = 1.00, idx=8388608, time=0.018049s
19+
parallel for argmax: m = 1.00, idx=8388608, time=1.061418s
20+
sequential recursive argmax: m = 1.00, idx=8388608, time=0.026117s
21+
parallel recursive argmax: m = 1.00, idx=8388608, time=0.013908s
22+
Running argmax with K = 2048
23+
sequential for argmax: m = 1.00, idx=8388608, time=0.018042s
24+
parallel for argmax: m = 1.00, idx=8388608, time=1.022062s
25+
sequential recursive argmax: m = 1.00, idx=8388608, time=0.026283s
26+
parallel recursive argmax: m = 1.00, idx=8388608, time=0.012478s
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/bin/bash
2+
#SBATCH --job-name=amax
3+
#SBATCH -p std
4+
#SBATCH --output=job.out
5+
#SBATCH --error=job.err
6+
#SBATCH --ntasks=1
7+
#SBATCH --cpus-per-task=8
8+
#SBATCH --time=00:00:10
9+
10+
#lscpu
11+
12+
export OMP_NUM_THREADS=4
13+
14+
make
15+
./argmax 1
16+
./argmax 128
17+
./argmax 512
18+
./argmax 1024
19+
./argmax 2048
20+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Running argmax with K = 8192 using 8 threads
2+
sequential for argmax: m = 1.00, idx_m=8388608, time=0.017529s
3+
parallel for argmax: m = 1.00, idx_m=8388608, time=0.037767s
4+
sequential recursive argmax: m = 1.00, idx_m=8388608, time=0.020405s
5+
parallel recursive argmax: m = 1.00, idx_m=8388608, time=0.035056s
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CC=gcc
2+
CFLAGS=-O2 -fopenmp -march=native -lm -std=c99
3+
OBJ=cholesky
4+
5+
6+
all:
7+
$(CC) main.c $(OBJ).c -o $(OBJ) $(CFLAGS)
8+
9+
clean:
10+
rm $(OBJ)
11+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /