실크 플러스
실크 플러스(Cilk Plus)는 병렬 프로그래밍을 위한 C/C++ 프로그램의 확장 언어이다. C/C++ 프로그래밍 언어에 현대의 CPU가 제공하고 있는 멀티 프로세서와 벡터 명령어를 활용하여 병렬 프로그래밍을 쉽게한다. 실크 플러스는 데이터와 테스크 병렬화를 위한 언어 확장을 지원하며, 윈도, 리눅스와 OS X에서 IA-32와 인텔 64 아키텍처의 프로그램을 위해 사용된다.
패러다임 | 명령형 (절차적), 구조적, 병렬 |
---|---|
설계자 | 인텔 |
개발자 | 인텔 |
발표일 | 2010 |
최근 버전 | 패러럴 스튜디오 2010 |
자료형 체계 | static, weak, manifest |
웹사이트 | www software |
영향을 받은 언어 | |
C, 실크 |
실크 플러스는 여러 컴파일러를 지원한다.
- 인텔 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대비하여 보장된 "최대 메모리 사용 확장성"과 같은 여러 장점을 제공한다. 개발자 커뮤니티 및 포럼은 실크 플러스 웹사이트 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);
}
같이 보기
편집외부 링크
편집- 실크 플러스 - 공식 웹사이트
- 인텔의 실크 플러스 - 공식 웹사이트
- Arch D. Robison, “Cilk Plus: Language Support for Thread and Vector Parallelism”[깨진 링크(과거 내용 찾기)] and “Parallel Programming with Cilk Plus”[깨진 링크(과거 내용 찾기)], Jul 16, 2012.