3.1.8.3.7.3. OpenMP

The following is an example of compiling a single node job (OpenMP) C program.

  1. Prepare source program.
    Sample program is prepared as /home/system/sample/C/openmp/trad_sample_omp.c.
 1#include <stdio.h>
 2#include <math.h>
 3#include <sys/time.h>
 4
 5#define N 5888
 6
 7double gettimeofday_sec(){
 8    struct timeval tv;
 9    gettimeofday(&tv, NULL);
10    return tv.tv_sec + (double)tv.tv_usec*1e-6;
11}
12
13int main(){
14    double a[N][N+1];
15    double b[N][N+1];
16    double c[N][N+1];
17    int i, j, k;
18    double t1,t2;
19
20//
21//  print message
22//
23    printf ("\n");
24    printf ("%d, %d\n", N, N);
25
26//
27//  initialize matrix
28//
29#pragma omp parallel for shared(a,b,c)
30    for (j = 0; j < N; j++) {
31       for (i = 0; i < N; i++) {
32          a[j][i] = 0.1;
33          b[j][i] = 0.3;
34          c[j][i] = 0.0;
35       }
36    }
37
38//
39//  do matrix multiply
40//
41    t1 = gettimeofday_sec();
42#pragma omp parallel for shared(a,b,c)
43    for (j = 0; j < N; j++) {
44       for (i = 0; i < N; i++) {
45          for (k = 0; k < N; k++) {
46             c[i][j] = c[i][j] + a[i][k] * b[k][j];
47          }
48       }
49    }
50    t2 = gettimeofday_sec();
51
52//
53//  print result
54//
55    printf("c[1][1] = %f\n", c[1][1]);
56    printf("time : %f sec.\n", t2 - t1);
57    return 0;
58}
  1. Compile sample program.

[_LNlogin]$ fccpx -V -Kfast,openmp,optmsg=2 -o sample_omp trad_sample_omp.c
fccpx: Fujitsu C/C++ Compiler 4.1.0
simulating gcc version 6.1
ccpcompx: Fujitsu C/C++ Compiler 4.1.0 (Dec 19 2019 16:14:08)
Optimization messages
  jwd6001s-i  "trad_sample_omp.c", line 31: SIMD conversion is applied to this loop with the loop variable 'i'.
  jwd8663o-i  "trad_sample_omp.c", line 31: This loop is not software pipelined because the software pipelining does not improve the performance.
  jwd8202o-i  "trad_sample_omp.c", line 31: Loop unrolling expanding 2 times is applied to this loop.
  jwd8101o-i  "trad_sample_omp.c", line 41: Inline expansion is applied to the user defined function 'gettimeofday_sec'.
  jwd8220o-i  "trad_sample_omp.c", line 43: Optimizations that may cause side effect are applied.
  jwd8331o-i  "trad_sample_omp.c", line 43: This loop is changed to the matmul library function call.
  jwd8101o-i  "trad_sample_omp.c", line 50: Inline expansion is applied to the user defined function 'gettimeofday_sec'.
GNU assembler version 2.30 (aarch64-linux-gnu) using BFD version version 2.30-49.el7
GNU ld version 2.30-49.el7
  Supported emulations:
   aarch64linux
   aarch64elf
   aarch64elf32
   aarch64elf32b
   aarch64elfb
   armelf
   armelfb
   aarch64linuxb
   aarch64linux32
   aarch64linux32b
   armelfb_linux_eabi
   armelf_linux_eabi
   i386pep
   i386pe
  1. Prepare job script.
    Job script sample is prepared as /home/system/sample/C/openmp/trad_job_openmp.sh.
#!/bin/sh
#PJM -L "node=1"
#PJM -L "rscgrp=small"
#PJM -L "elapse=10:00"
#PJM -x PJM_LLIO_GFSCACHE=/vol000N
#PJM -g groupname
#PJM -s

# execute job
export OMP_NUM_THREADS=12
./sample_omp
  1. Submit a job with pjsub command.

[_LNlogin]$ pjsub trad_job_openmp.sh
 [INFO] PJM 0000 pjsub Job 117 submitted.
  1. Check execution result.
    The standard output is outpput as job name.job ID.out.
[_LNlogin]$ cat trad_job_openmp.sh.117.out

5888, 5888
c[1][1] = 176.640000
time : 10.873365 sec.