Skip to content

Commit

Permalink
revision
Browse files Browse the repository at this point in the history
  • Loading branch information
ssvassiliev committed Jun 11, 2024
1 parent bc33601 commit 132ff69
Show file tree
Hide file tree
Showing 10 changed files with 213 additions and 3 deletions.
2 changes: 1 addition & 1 deletion _episodes/02-hello_world.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ int main(int argc, char **argv) {
}
~~~
{:.language-c}
[hello_template.c](https://github.com/acenet-arc/ACENET_Summer_School_OpenMP_ACC/raw/gh-pages/code/hello_template.c)
[hello_serial.c](https://github.com/acenet-arc/ACENET_Summer_School_OpenMP_ACC/raw/gh-pages/code/hello_serial.c)
</div>

Make a copy named `hello_omp.c`.
Expand Down
30 changes: 30 additions & 0 deletions code/array_max_serial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
#include <math.h>

int main(int argc, char **argv) {
int size = 1e8;
int *rand_nums;
int i;
int curr_max;
time_t t;

rand_nums=malloc(size*sizeof(int));

/* Intialize random number generator */
srand((unsigned) time(&t));
/* Initialize array with random values */
for (i=0; i<size; i++) {
rand_nums[i] = rand();
}

/* Find maximum */
curr_max = 0.0;
for (i=0; i<size; i++) {
curr_max = fmax(curr_max, rand_nums[i]);
}

printf("Max value is %d\n", curr_max);
}
26 changes: 26 additions & 0 deletions code/array_multiply_serial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/* -- File array_multiply.c --- */
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(int argc, char **argv)
{
double start, end;
int size = 5e8;
int multiplier = 2;
int *A, *C;
int i;

/* Allocate memory for arrays */
A = malloc(size * sizeof(int));
C = malloc(size * sizeof(int));

start = omp_get_wtime();
/* Multiply array a by multiplier */
for (i = 0; i < size; i++)
{
C[i] = multiplier * A[i];
}
end = omp_get_wtime();
printf("Total time is %f s\n", end-start);
}
56 changes: 56 additions & 0 deletions code/elect_energy_serial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/* --- File elect_energy.c --- */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(int argc, char **argv)
{
struct timespec ts_start, ts_end;
float time_total;
int n = 60; /* number of atoms per side */
int n_charges = n * n * n; /* total number of charges */
float a = 0.5; /* lattice constant a (a=b=c) */
float *q; /* array of charges */
float *x, *y, *z; /* x,y,z coordinates */
float dx, dy, dz, dist; /* temporary pairwise distances */
double Energy = 0.0; /* potential energy */
int i, j, k;

q = malloc(n_charges * sizeof(float));
x = malloc(n_charges * sizeof(float));
y = malloc(n_charges * sizeof(float));
z = malloc(n_charges * sizeof(float));
/* Seed random number generator */
srand(111);
/* initialize coordinates and charges */
int l = 0;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
for (k = 0; k < n; k++)
{
x[l] = i * a;
y[l] = j * a;
z[l] = k * a;
/* Generate random numbers between -5 and 5 */
q[l] = 10 * ((double)random() / (double)RAND_MAX - 0.5);
l++;
}

/* Calculate sum of all pairwise interactions: q[i]*q[j]/dist[i,j] */
clock_gettime(CLOCK_MONOTONIC, &ts_start);
for (i = 0; i < n_charges; i++)
{
for (j = i + 1; j < n_charges; j++)
{
dx = x[i] - x[j];
dy = y[i] - y[j];
dz = z[i] - z[j];
dist = sqrt(dx * dx + dy * dy + dz * dz);
Energy += q[i] * q[j] / dist;
}
}
clock_gettime(CLOCK_MONOTONIC, &ts_end);
time_total = (ts_end.tv_sec - ts_start.tv_sec) * 1e9 + (ts_end.tv_nsec - ts_start.tv_nsec);
printf("\nTotal time is %f ms, Energy is %.3f\n", time_total / 1e6, Energy * 1e-4);
}
27 changes: 27 additions & 0 deletions code/find_factor_serial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/* File: find_factor.c */
#include <stdio.h>
#include <stdlib.h>

int main()
{
int N = 26927249;
int f;
for (f = 2; f <= N; f++)
{
if (f % 200 == 0) /* Print progress */
{
fprintf(stdout, "checking: %li\n", f);
fflush(stdout);
}

/* Check if f is a factor { */
if (N % f == 0)
{ // the remainder is 0, found factor!
fprintf(stdout, "Factor: %li\n", f);
exit(0);
}
for (int i = 1; i < 4e6; i++)
; /* Burn some CPU cycles */
/* End of check */
}
}
6 changes: 6 additions & 0 deletions code/hello_serial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
printf("Hello World\n");
}
16 changes: 16 additions & 0 deletions code/integrate_sin_serial.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char **argv) {
int steps = 5e7; /* Number of rectangles */
double delta = M_PI/steps; /* Width of each rectangle */
double total = 0.0; /* Accumulator */
int i;

printf("Using %.0e steps\n", (float)steps);
for (i=0; i<steps; i++) {
total += sin(delta*i) * delta;
}
printf("The integral of sine from 0 to Pi is %.12f\n", total);
}
2 changes: 1 addition & 1 deletion code/matrix_sum_omp.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ int main(int argc, char **argv)
C[i] = 0;

start = omp_get_wtime();
#pragma omp parallel for private(j)
#pragma omp parallel for
/* Each thread sums one column */
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
Expand Down
2 changes: 1 addition & 1 deletion code/task_depend_omp.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ int main(int argc, char **argv)
for (i = 1; i < N; i++)
{
for (j = 1; j < N; j++)
#pragma omp task
#pragma omp task depend(out:y)
y[i][j] = y[i - 1][j] + y[i][j - 1];
}

Expand Down
49 changes: 49 additions & 0 deletions code/vadd_gpu.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/* Compute sum of vectors A and B */
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(int argc, char *argv[])
{
double start, end;
int size = 1e8;
float *A;
float *B;
float *C;
double sum = 0.0f;
int ncycles=1;

if( argc == 2 )
ncycles=atoi(argv[1]);
else
printf("Usage: vadd number_of_cycles\n");


A = (float *)malloc(size * sizeof(float *));
B = (float *)malloc(size * sizeof(float *));
C = (float *)malloc(size * sizeof(float *));

/* Initialize vectors */
for (int i = 0; i < size; i++)
{
A[i] = (float)rand() / RAND_MAX;
B[i] = (float)rand() / RAND_MAX;
}

start = omp_get_wtime();
#pragma omp target data map(to: A[0:size], B[0:size]) map(from: C[0:size])
for (int k = 0; k < ncycles; k++){
#pragma omp target teams distribute parallel for reduction(+:sum) map(tofrom: sum)
for (int i = 0; i < size; i++)
{
C[i] = A[i] + B[i];
sum += C[i];
}
}

end = omp_get_wtime();

printf("\nNum cycles: %i Time: %f seconds\n", ncycles, end - start);
sum = sum / size;
printf("Sum = %f\n ", sum / ncycles);
}

0 comments on commit 132ff69

Please sign in to comment.