「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は、インテルのコンパイラ以外に、gccclangなどでも利用できます。

読み方

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

関連項目