簡単!macでcilkを無料で動かします!

こんにちは、ヤマヤタケシです。
ふと、たまにはプログラマっぽいことをやろうと思いました。

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
して終了です。

おつかれさまでした。
使ってみるのはまた今度。