「Cilk Plus」の版間の差分
提供: C言語入門
(ページの作成:「インテルのCilk Plus とは、C/C++言語に単純なキーワードでパラレル並列コンピューティングの機能を提供します。cilk_forでル...」) |
(相違点なし)
|
2014年5月17日 (土) 01:10時点における最新版
インテルのCilk Plus とは、C/C++言語に単純なキーワードでパラレル並列コンピューティングの機能を提供します。cilk_forでループの並列化し、cilk_spwanで並列実行を行い、cilk_syncで並列実行の終了を待ちます。Cilk Plusは、インテルのコンパイラ以外に、gccやclangなどでも利用できます。
読み方
- Cilk Plus
- しるく ぷらす
目次
概要
Cilk Plusのキーワードには、以下のものがあります。
- cilk_for
- ループを並列化します。
- cilk_spwan
- 並列実行を行います。
- cilk_sync
- 並列実行の終わりを待ちます。
cilk_forによるforの並列化の例
cilk_forは、OpenMPにおけるpragma omp parallel forです。
ソースコード cilk_for1.c
/* * cilk_for1.c * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <cilk/cilk.h> const size_t max = 8; int main(int argc, char *argv[]) { size_t i; cilk_for (i = 0; i < max; i++) { printf ("%d\n", i); } exit(EXIT_SUCCESS); }
コンパイル
cc -fcilkplus cilk_for1.c -o cilk_for1
gcc 4.9だと cilk_for (の本体の _Clik_for)の実装がないのか、コンパイルできません。
$ gcc49 -fdiagnostics-color=auto \ -I/usr/local/lib/gcc49/gcc/x86_64-portbld-freebsd10.0/4.9.1/include/ \ -fcilkplus -std=c99 -lcilkrts -L/usr/local/lib/gcc49/ cilk_for1.c cilk_for1.c: In function 'main': cilk_for1.c:18:2: warning: implicit declaration of function '_Cilk_for' [-Wimplicit-function-declaration] cilk_for (i = 0; i < max; i++) { ^ cilk_for1.c:18:17: error: expected ')' before ';' token cilk_for (i = 0; i < max; i++) { ^ cilk_for1.c:18:33: error: expected ';' before '{' token cilk_for (i = 0; i < max; i++) { ^ *** Error code 1
実行例
% ./cilk_for1
cilk_spawnによる並列実行の例
ソースコード cilk_spawn1.c
/* * cilk_for1.c * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #include <cilk/cilk.h> int foo() { sleep(2); (void) printf("done: %s\n", __func__); return 0; } int main(int argc, char *argv[]) { size_t i; int x = cilk_spawn foo(); int y = cilk_spawn foo(); (void) printf("wait\n"); cilk_sync; exit(EXIT_SUCCESS); }
コンパイル
ここでは、gcc 4.9を利用してコンパイルしています。 以下のパスは、FreeBSDで行う場合です。
$ gcc49 -fdiagnostics-color=auto \ -I/usr/local/lib/gcc49/gcc/x86_64-portbld-freebsd10.0/4.9.1/include/ \ -fcilkplus -std=c99 -lcilkrts -L/usr/local/lib/gcc49/ cilk_spawn1.c \ -o cilk_spawn1
実行例
$ /usr/bin/time ./cilk_spawn1 done: foo wait done: foo 2.02 real 0.00 user 0.00 sys