こんにちは、ヤマヤタケシです。
ふと、たまにはプログラマっぽいことをやろうと思いました。
cilkというマルチスレッドをハイパー使いやすくなるc言語を拡張した言語があります。
cilkはCPUメーカーのintelが自社のコンパイラに組み込んで出しています。
もともとcilkは別の会社の製品でしたが、intelが会社ごとお買い上げになりました。
数年前のintelのセミナーでは、「ゴメン、OpenMPは捨ててcilk使って」と言ってましたよ!
オフィシャルサイト
[browser-shot url=”http://cilkplus.org/which-license#gcc-development” width=”600″]
cilkはcilk plusという名前になっているようですね。
どうやら、オープンソース化していて、gccベースのものと、clangベースのものあるようです。
svnでとれるっぽい。
svn checkout http://gcc.gnu.org/svn/gcc/branches/cilkplus/
ぐぅ、時間かかるなぁ。
macでビルドできるかな・・・。
さすが、製品クラス。checkoutが時間がかかりすぎます。
途中でタイムアウトになってるし、あきらめました!
別のやつ。
マサチューセッツ工科大学にあるのは軽そうです!
[browser-shot url=”http://supertech.csail.mit.edu/cilk/” width=”600″]
wget http://supertech.csail.mit.edu/cilk/cilk-5.4.6.tar.gz
tar xvfz cilk-5.4.6.tar.gz
./configure
make
ぐぅ、エラー!?
/usr/include/mach/i386/_structs.h:97: syntax error
グーグル先生に、mac cilk syntaxで検索。
ヒット!
[browser-shot url=”http://d.hatena.ne.jp/yuyarin/20101026/1288036789
” width=”600″]
お、まんまだ!
無名のbitフィールドがエラーの原因か・・・。
cd /usr/include/mach/i386/
cp _structs.h _structs.h.org
chmod +w _structs.h
emacs _structs.h
で、
__tmp1 : 2
とかにする。
make
さっきのは通りましたが、またエラーです。
/usr/include/stdlib.h:275: syntax error
/usr/include/stdlib.h:275: declaration without a variable
さっきのサイトの通りなのですが、(^)を(x)にemacsで置き換えました。
stdlib.hをいじるというドッキドッキワックワック。
diffで確認すると、
diff /usr/include/stdlib.h /usr/include/stdlib.h.org
275c275
< int atexit_b(void (x)(void)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
---
> int atexit_b(void (^)(void)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
277c277
< size_t, int (x)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
---
> size_t, int (^)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
304c304
< int (x)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
---
> int (^)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
310c310
< int (x)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
---
> int (^)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
316c316
< int (x)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
---
> int (^)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
322c322
< int (x)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
---
> int (^)(const void *, const void *)) __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_2);
まだエラーがでます。
さらにstring.hを修正します。
もう、さっきのサイトの通りにね。
/usr/include% diff string.h string.h.original
146c146
< #if defined (__GNUC__) && _FORTIFY_SOURCE > 0 && !defined (__cplusplus) && !defined (__CILK)
—
> #if defined (__GNUC__) && _FORTIFY_SOURCE > 0 && !defined (__cplusplus)
最後に、
alias cilkc=’cilkc -D__CILK’
ってやります。
しかし、makeをしてもまだとおりません。
ついに、このポストのオリジナル部分です。
今までは、すべて、さっきのサイトの通りに実行していただけですから。
で、チェックのタイミングでは、cilkcを使わずに、
../support/cilklocal
を使用しています。
それは、-D__CILKが影響していないからです。
/example/Makefile
を修正します。
diff Makefile Makefile.org
296c296
< CILKFLAGS = -g -O2 -D__CILK
---
> CILKFLAGS = -g -O2
ついに、exampleが実行されました!
最後に、
sudo make install
して終了です。
おつかれさまでした。
使ってみるのはまた今度。