실크 플러스

file_ext = **실크 플러스**(Cilk Plus)는 병렬 프로그래밍을 위한 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의 확장으로 적용을 하고 있다고 발표하였다. 지금까지의 작업은 GitHub에 있다. 실크 플러스 런타임 라이브러리는 다음 제품에서 지원된다. * 상용제품: 인텔 C++ 컴파일러 * GPL V3: GCC C/C++ 컴파일러에 포함된 런타임 예외 * BSD-3: Clang/LLVM에 포함됨. 소스 코드는 BSD-3 라이센스 정책아래 cilkplus.org 웹사이트에 있음 실크 플러스는 OpenMP대비하여 보장된 "최대 메모리 사용 확장성"과 같은 여러 장점을 제공한다. 개발자 커뮤니티 및 포럼은 실크 플러스 웹사이트 url=https://web.archive.org/web/20210117031010/http://www.cilkplus.org/이다.
# 역사
실크 프로그래밍 언어는 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); }