{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보
| 이름                   = 실크 플러스(Cilk Plus)
| logo                   =
| 패러다임               = [[명령형 프로그래밍|명령형]] ([[절차적 프로그래밍|절차적]]), [[구조적 프로그래밍|구조적]], [[병렬 프로그래밍|병렬]]
| 연도                   = 2010
| 설계자               = 인텔
| 개발자              = 인텔
| 최근 버전 = 패러럴 스튜디오 2010
| 최근 출시 일    = {{시작 날짜와 나이|2010|9|2}}
| typing                 = [[Type system|static]], [[Weak typing|weak]], [[manifest typing|manifest]]
| implementations        =
| 방언               =
| 영향을 받은 언어          = [[C (프로그래밍 언어)|C]], [[실크]]
| 영향을 준 언어             =
| operating_system       =
| 라이선스                =
| 웹사이트                = {{URL|www.cilkplus.org}}<br/>{{URL|software.intel.com/en-us/intel-cilk-plus}}
| file_ext               =
}}

'''실크 플러스'''({{lang|en|Cilk Plus}})는 [[병렬 프로그래밍]]을 위한 [[C 프로그래밍 언어|C]]/[[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/{{깨진 링크|url=http://gcc.gnu.org/svn/gcc/branches/cilkplus-4_8-branch/ }} 인텔은 실크 플러스를 GCC의 주류로 합치려고 노력하고 있다.
* [[Clang]]/[[LLVM]] - 인텔은 2013년 2월에 실크 플러스를 Clang/LLVM의 확장으로 적용을 하고 있다고 발표하였다. 지금까지의 작업은 [http://cilkplus.github.io/ GitHub]에 있다.
실크 플러스 [[런타임 라이브러리]]는 다음 제품에서 지원된다.
* 상용제품: 인텔 C++ 컴파일러
* [http://www.gnu.org/licenses/gpl.html GPL V3]: GCC C/C++ 컴파일러에 포함된 [http://www.gnu.org/licenses/gcc-exception-3.1.html 런타임 예외]
* [http://opensource.org/licenses/BSD-3-Clause BSD-3]: Clang/LLVM에 포함됨. 소스 코드는 BSD-3 라이센스 정책아래 cilkplus.org 웹사이트에 있음
실크 플러스는 [[OpenMP]]대비하여 보장된 "최대 메모리 사용 확장성"과 같은 여러 장점을 제공한다. 개발자 커뮤니티 및 포럼은 [http://www.cilkplus.org 실크 플러스 웹사이트] {{웨이백|url=http://www.cilkplus.org/ |date=20210117031010 }}이다.

==역사==
실크 프로그래밍 언어는 [[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으로 [http://supertech.csail.mit.edu/cilk/intro.html 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) 함수이다.
<syntaxhighlight lang=c line>
int fib(int n)
{
    if (n < 2)
        return n;
    int x = fib(n-1);
    int y = fib(n-2);
    return x + y;
}
</syntaxhighlight>

병렬화를 아래처럼 간단한 변경으로 할 수 있다. 함수 fib(n-1)의 계산을 fib(n-2)과 아무런 간섭없이 병렬로 실행할 수 있다.
<syntaxhighlight lang=c line highlight="5,7">
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;
}
</syntaxhighlight>


===단순한 for loop – cilk_for===

<syntaxhighlight lang=c line highlight=1>
for (int i = 0; i < 8; ++i)
{
    do_work(i);
}
</syntaxhighlight>

cilk_for loop 사용으로 병렬화한 예:
<syntaxhighlight lang=c line highlight=1>
cilk_for (int i = 0; i < 8; ++i)
{
    do_work(i);
}
</syntaxhighlight>

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

== 외부 링크 ==
* {{공식 웹사이트|www.cilkplus.org}}
* 인텔의 {{공식 웹사이트|software.intel.com/en-us/intel-cilk-plus}}
* Arch D. Robison, [http://parallelbook.com/files/CilkPlus-HPCAST18_0.pdf “Cilk Plus: Language Support for Thread and Vector Parallelism”]{{깨진 링크|url=http://parallelbook.com/files/CilkPlus-HPCAST18_0.pdf }} and [http://parallelbook.com/files/ISC2012_Tutorial_9_CilkPlus_Robison_final.pdf “Parallel Programming with Cilk Plus”]{{깨진 링크|url=http://parallelbook.com/files/ISC2012_Tutorial_9_CilkPlus_Robison_final.pdf }}, Jul 16, 2012.

{{인텔 소프트웨어}}
{{병렬 컴퓨팅}}

[[분류:C 프로그래밍 언어 계열]]
[[분류:인텔 제품]]