OpenMP 並列化
はじめに
GCCのオプションで、並列コンパイルのオプションがないものかと調べていたら、実行の並列化オプションがあった。
それを試してみようと思い、その結果を残す。
手順
- ソース作成
- Makefile.amの作成
- [autoscan]実行
- configure.acの編集
- [autoreconf]実行
- [./configure]実行
- [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])
-
- -
[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
ちょっと速くなってる。