실크 플러스

실크 플러스(Cilk Plus)
패러다임명령형 (절차적), 구조적, 병렬
설계자인텔
개발자인텔
발표일2010
최근 버전패러럴 스튜디오 2010
자료형 체계static, weak, manifest
웹사이트www.cilkplus.org
software.intel.com/en-us/intel-cilk-plus
영향을 받은 언어
C, 실크

실크 플러스(Cilk Plus)는 병렬 프로그래밍을 위한 C/C++ 프로그램의 확장 언어이다. C/C++ 프로그래밍 언어에 현대의 CPU가 제공하고 있는 멀티 프로세서벡터 명령어를 활용하여 병렬 프로그래밍을 쉽게한다. 실크 플러스는 데이터테스크 병렬화를 위한 언어 확장을 지원하며, 윈도, 리눅스OS X에서 IA-32인텔 64 아키텍처의 프로그램을 위해 사용된다.

실크 플러스는 여러 컴파일러를 지원한다.

실크 플러스 런타임 라이브러리는 다음 제품에서 지원된다.

  • 상용제품: 인텔 C++ 컴파일러
  • GPL V3: GCC C/C++ 컴파일러에 포함된 런타임 예외
  • BSD-3: Clang/LLVM에 포함됨. 소스 코드는 BSD-3 라이센스 정책아래 cilkplus.org 웹사이트에 있음

실크 플러스는 OpenMP대비하여 보장된 "최대 메모리 사용 확장성"과 같은 여러 장점을 제공한다. 개발자 커뮤니티 및 포럼은 실크 플러스 웹사이트 Archived 2021년 1월 17일 - 웨이백 머신이다.

역사

실크 프로그래밍 언어는 MIT 컴퓨터 공학 연구소에서 세개의 개별 프로젝트에서 진화되었다.

  • 다중 스레드 애플리케이션 스케줄링에 대한 이론 작업
  • StarTech - Thinking Machines Corporation의 Connection Machine 모델 CM-5에서 동작하도록 작성된 병렬 체스 프로그램
  • PCM/Threaded-C - CM-5에서 continuation-passing-style 스레드들의 스케줄링을 위한 C 기반 패키지

1994년 4월 세개의 프로젝트들은 하나로 합쳐져 실크(Cilk)라고 이름 지어졌다. 실크(Cilk)라는 이름은 약어가 아니며 "좋은 실"(비단, silk) 과 C 프로그래밍 언어를 빗댄말이다. MIT 실크는 C의 확장이며 소스 대 소스 번역기로서 개발되었다. 실크-1 시스템은 1994년 9월에 발표되었으며 현재는 실크-5.3으로 MIT Computer Science and Artificial Intelligence Laboratory (CSAIL)에 있다. 그렇지만 현재 지원하지 않는다. 2006년에 실크 아츠(Cilk Arts)는 MIT로부터 상용 C++를 위한 목적으로 실크 기술을 라이센스하였다. 실크++ v1.0은 2008년 12월에 윈도 비주얼 스튜디오와 GCC/C++를 지원하는 제품으로 발표되었다. 2009년 7월 31일에 실크 아츠는 인텔에 제품과 엔지니어 팀이 인수되었다. 인텔과 실크 아츠는 통합되어 더욱 더 개선되었으며, 2010년 9월 인텔 실크 플러스라는 이름으로 새롭게 발표되었다. 인텔 실크 플러스는 배열 확장이 추가됨으로써 실크와 실크++와는 다르다. 상용 인텔 컴파일러에서 지원되며 기존의 디버거와 호환된다.

핵심 요소

키워드

  • cilk_for - 루프 부분의 반복이 병렬로 실행되도록 함.
  • cilk_spawn - 함수를 호출한 함수가 끝날 때까지 기다리지 않고 비동기적으로 실행하도록 규정한다. 병렬화를 강제하는 명령어가 아니라 병렬화를 할 수 있는 기회에 대한 표현이다. 인텔 실크 플러스 런타임은 호출한 함수가 병렬로 동작할 수 있을지 없을지를 선택한다.
  • cilk_sync - 함수에서 스폰(Spawn)된 호출은 프로그램이 계속 실행하기 전에 반드시 완료해야 한다는 것을 규정한다. cilk_spawn을 포함하고 있는 모든 함수의 끝에 cilk_sync가 암묵적으로 포함된다.

리듀서

인텔 실크 플러스는 프로그램 병렬화를 더욱 쉽게하기 위해 리듀서(Reducer)를 제공한다. 전통적인 병렬 프로그램은 공유 변수를 보호하기 위해 록(Lock)을 사용한다. 이 록은 주의해서 사용하지 않을 경우 데드락이나 프로그램이 느려지는 것과같은 여러 문제를 야기할 수 있다. 비록 록이 경쟁을 방지하나 비 결정적 결과를 강제할 방법은 없다. 리듀서는 병렬화 코드가 변수를 프라이빗 관점에서 사용할 수 있으며 록을 사용하지 않아도 되는 방법을 제공한다. 변수의 병합은 다음 번 싱크에서 이뤄지며 인텔 실크 플러스 애플리케이션의 순차적인 시만틱을 유지하기 위해 순서대로 이루어진다.

배열 표기법

인텔 실크 플러스는 사용자가 배열의 모든 부분이나 일부에 대한 처리를 할 수 있는 배열 표기법(Array Notation)을 제공한다. 이러한 표기법은 컴파일러가 효과적으로 벡터화를 할 수 있도록 도와준다. 인텔 실크 플러스는 C/C++ 가 여러 배열 요소들을 병렬화할 수 있도록 한다. 또한 벡터화된 이동, 회전, 제거등과 같은 내장된 기능들을 제공한다.

#pragma simd

이 프레그마는 컴파일러가 자동 벡터화가 실패하는 경우에도 루프를 벡터화 할 수 있게 한다. 프로그래머가 직접 벡터화를 적용할 수 있는 쉬운 방법이다.

프로그램 예

피보나치(Fibonacci) – cilk_spawn, cilk_sync

아래는 피보나치 수를 계산하는 함수이다. 다른 많은 효율적인 알고리즘이 있지만 이 예는 간단한 점화식(Recursive function) 함수이다.

int fib(int n)
{
    if (n < 2)
        return n;
    int x = fib(n-1);
    int y = fib(n-2);
    return x + y;
}

병렬화를 아래처럼 간단한 변경으로 할 수 있다. 함수 fib(n-1)의 계산을 fib(n-2)과 아무런 간섭없이 병렬로 실행할 수 있다.

int fib(int n)
{
    if (n < 2)
        return n;
    int x = cilk_spawn fib(n-1);
    int y = fib(n-2);
    cilk_sync;
    return x + y;
}


단순한 for loop – cilk_for

for (int i = 0; i < 8; ++i)
{
    do_work(i);
}

cilk_for loop 사용으로 병렬화한 예:

cilk_for (int i = 0; i < 8; ++i)
{
    do_work(i);
}

같이 보기

외부 링크