Cilk, C에 기반한 병렬 프로그래밍 언어

멀티코어 프로세서가 대세로 자리잡은 요즘
함수형 언어 Haskell이 상당한 장점을 가진다는 글을 읽고,
예전에 한번 돌려본 Cilk가 얼마나 잘 할 수 있을까 간단히 테스트 해 봤다.
위키피디아에는 C에 기반한 멀티 쓰레드 병렬 프로그래밍 언어라고 소개되어 있다.

Clik 철학은 C(C++)에 간단한 키워드를 도입하여 프로그래머가 어느 부분이
병렬화가능한지 지정해 주면, 런타임시에 지정된 부분을 알아서 병렬화 하겠다는 것이다.
그래서, 프로그램 소스는 C와 거의 동일하다.
눈여겨 볼 키워드로는 spawn, sync, cilk등이 있다.
이 키워드를 기본으로 cilk2c 라는 프로그램이 C 프로그램으로 바꾸어준 다음
나머지는 일반 C프로그램과 동일하게 처리된다.

Cilk는 GNU로 공개되어 있고, tarball을 다운 받아 간단히 설치 가능하다.

wget http://supertech.csail.mit.edu/cilk/cilk-5.4.6.tar.gz
tar xvfz cilk-5.4.6.tar.gz
cd cilk-5.4.6/
./configure
make
make install

Cilk의 매뉴얼에서 제시하는 첫 예제도 Fibonacci 수열인데,
Haskell과 비교를 해보기 위해 해당글의 C 프로그램 예제를 Cilk용으로 고쳤다.

#include <stdio.h>
#include <stdlib.h>

cilk long long fib(long long n) {
  if (n < 2) {
    return 1;
  } else {
  long long x,y;
  x = spawn fib(n-2);
  y = spawn fib(n-1);
  sync;
  return x+y;
 }
}

cilk int main(int argc, char ** argv) {
  long long n = 0;

  for (n = 0; n <= 40; n++) {
        long long ret;
        ret = spawn fib(n);
        sync;
      printf(“fib(%lld) = %lld\n”, n, ret );
  }

  return 0;
}

컴파일을 하고 실행을 하였더니 (–nproc 은 cpu를 알아서 쓰라는 얘기, 2개가 있으니 2개를 씀)

cilkc -O2 fib.cilk -o fib-cilk
time ./fib-cilk –nproc 0

결과가 나왔다.

real    0m40.979s
user    1m10.340s
sys     0m0.432s

이럴 수가! 너무 느려!!!
이 컴퓨터가 느려서 그런가 확인 하려고 비교 대상인 C프로그램을 돌렸더니

gcc -O2 fib.c -o fib
time ./fib

real    0m6.735s
user    0m6.568s
sys     0m0.000s

컴퓨터 문제가 아니고, Cilk로 짠 프로그램이 너무 느렸던거다.
아무리 편리하다고 해도 이 정도로 성능이 나쁘면 쓰기 힘들텐데…
Cilk를 기본으로 상업용 Cilk++ 이 곧 나온다던데, 이건 좀 쓸만해지지 않을까.
http://www.cilk.com/index.htm