OpenMP 並列化

はじめに

 GCCのオプションで、並列コンパイルのオプションがないものかと調べていたら、実行の並列化オプションがあった。
それを試してみようと思い、その結果を残す。

参考サイト
OpenMPの使い方:tech.ckme.co.jp

ソース等一式
https://github.com/tomohikoseven/gccmulti

手順

  1. ソース作成
  2. Makefile.amの作成
  3. [autoscan]実行
  4. configure.acの編集
  5. [autoreconf]実行
  6. [./configure]実行
  7. [make]実行

ソース作成

main.c

andre@andre-VirtualBox:~/work/gccmulti$ cat main.c
#include
#include"fib.h"

#define LOOP_CNT 10

int
main( )
{
#ifdef _OPENMP
printf( "The number of processors is %d\n", omp_get_num_procs( ) );
#endif
    int i_cnt = 0;
    #ifdef _OPENMP
    #pragma omp parallel for
    #endif
    for ( i_cnt = 0; i_cnt < LOOP_CNT; i_cnt++ )
    {
        printf( "fib:%lu\n", fib( 40 ) );
    }
    return 0;
}

fib.c

andre@andre-VirtualBox:~/work/gccmulti$ cat fib.c
#define FIB(x) fib(x)

unsigned long fib(int n)
{
  if (n<3) return 1;
  return FIB(n-2)+FIB(n-1);
}

fib.h

andre@andre-VirtualBox:~/work/gccmulti$ cat fib.h
extern unsigned long fib( int n );

Makefile.amの作成

OpenMP版と通常版の2つを作る。
Makefile.am

andre@andre-VirtualBox:~/work/gccmulti$ cat Makefile.am
bin_PROGRAMS        = main_single main_multi
main_single_SOURCES = main.c fib.c fib.h
main_multi_SOURCES  = main.c fib.c fib.h

main_multi_CFLAGS  = -fopenmp

[autoscan]実行

andre@andre-VirtualBox:~/work/gccmulti$ autoscan

configure.acの編集

autoscanで作成された configure.scan を configure.acにリネームし、編集する。

andre@andre-VirtualBox:~/work/gccmulti$ diff configure.scan configure.ac
5c5,6
< AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    • -
> AC_INIT([main_single], [1.0]) > AM_INIT_AUTOMAKE([-Wall -Werror foreign])

[autoreconf]実行

オプション -ivf をつけて実行。

andre@andre-VirtualBox:~/work/gccmulti$ autoreconf -ivf
autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: running: aclocal --force
autoreconf: configure.ac: tracing
autoreconf: configure.ac: not using Libtool
autoreconf: running: /usr/bin/autoconf --force
autoreconf: running: /usr/bin/autoheader --force
autoreconf: running: automake --add-missing --copy --force-missing
autoreconf: Leaving directory `.'

[./configure]実行

andre@andre-VirtualBox:~/work/gccmulti$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands

[make]実行

andre@andre-VirtualBox:~/work/gccmulti$ make
make  all-am
make[1]: ディレクトリ `/home/andre/work/gccmulti' に入ります
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT fib.o -MD -MP -MF .deps/fib.Tpo -c -o fib.o fib.c
mv -f .deps/fib.Tpo .deps/fib.Po
gcc  -g -O2   -o main_single main.o fib.o
gcc -DHAVE_CONFIG_H -I.    -fopenmp -g -O2 -MT main_multi-main.o -MD -MP -MF .deps/main_multi-main.Tpo -c -o main_multi-main.o `test -f 'main.c' || echo './'`main.c
mv -f .deps/main_multi-main.Tpo .deps/main_multi-main.Po
gcc -DHAVE_CONFIG_H -I.    -fopenmp -g -O2 -MT main_multi-fib.o -MD -MP -MF .deps/main_multi-fib.Tpo -c -o main_multi-fib.o `test -f 'fib.c' || echo './'`fib.c
mv -f .deps/main_multi-fib.Tpo .deps/main_multi-fib.Po
gcc -fopenmp -g -O2   -o main_multi main_multi-main.o main_multi-fib.o
make[1]: ディレクトリ `/home/andre/work/gccmulti' から出ます

実行結果

作成された実行ファイル main_single と main_multi の実行時間を測定してみた。

andre@andre-VirtualBox:~/work/gccmulti$ time ./main_single
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155

real    0m8.291s
user    0m8.249s
sys     0m0.044s
andre@andre-VirtualBox:~/work/gccmulti$ time ./main_multi
The number of processors is 2
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155
fib:102334155

real    0m6.643s
user    0m10.237s
sys     0m0.044s

ちょっと速くなってる。