실크 플러스

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

실크 플러스는 여러 컴파일러를 지원한다.
 인텔 C++ 컴파일러(ICC) - 인텔은 인텔 컴포저 XE 2010을 발표할 때 C와 C++ 언어의 확장으로 실크 플러스를 지원한다고 발표하였다.
 GNU 컴파일러 컬렉션 - 인텔은 GCC C와 C++ 컴파일러에 실크 플러스 확장을 적용하였다. GCC 4.8의 한 가지로 모든 기능이 적용되었으며 다음 사이트에서 받을 수 있다. http://gcc.gnu.org/svn/gcc/branches/cilkplus-4_8-branch/ 인텔은 실크 플러스를 GCC의 주류로 합치려고 노력하고 있다.
 Clang/LLVM - 인텔은 2013년 2월에 실크 플러스를 Clang/LLVM의 확장으로 적용을 하고 있다고 발표하였다. 지금까지의 작업은 GitHub에 있다.
실크 플러스 런타임 라이브러리는 다음 제품에서 지원된다.
 상용제품: 인텔 C++ 컴파일러
 GPL V3: GCC C/C++ 컴파일러에 포함된 런타임 예외
 BSD-3: Clang/LLVM에 포함됨. 소스 코드는 BSD-3 라이센스 정책아래 cilkplus.org 웹사이트에 있음
실크 플러스는 OpenMP대비하여 보장된 "최대 메모리 사용 확장성"과 같은 여러 장점을 제공한다. 개발자 커뮤니티 및 포럼은 실크 플러스 웹사이트 이다.

역사
실크 프로그래밍 언어는 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);
}

같이 보기 
 Cilk
 Sieve C++ Parallel Programming System
 Grand Central Dispatch
 CilkChess
 Intel Concurrent Collections (CnC)
 인텔 DZ
 병렬 컴퓨팅
 인텔 스레딩 빌딩 블록 (TBB)
 인텔 패러럴 빌딩 블록 (PBB)
 인텔 패러럴 스튜디오

외부 링크 
 
 인텔의 
 Arch D. Robison, “Cilk Plus: Language Support for Thread and Vector Parallelism” and “Parallel Programming with Cilk Plus”, Jul 16, 2012.

C 프로그래밍 언어 계열
인텔 제품