본 포스팅은 Stanford Univ. 의 CS149 2022 fall 수업을 정리한 내용임을 밝힙니다.
What is ISPC?
ISPC
: Intel SPMD Program Compiler (ISPC)
+ Nice post
SPMD
: Sinle Program Multiple Data
Example code
ISPC 함수를 호출하면 ISPC의 “program instances”의 “gang”이 생성된다. 모든 instances들은 ISPC code를 동시에 수행한다.
각 instance는 복사된 local variables (오른쪽 코드의 파란색 변수들) 를 갖는다. 이를 나중에는 “uniform”이라고 명명한다. return 시에는 모든 instances 가 종료된다.
ISPC Language Keyworks
programCount
: gang 안에서 한 번에 동시에 수행될 수 있는 instances의 수 (uniform value)
programIndex
: 어떤 instance 에서의 id (non-uniform value: “각 instance마다 달라질 수있음”)
uniform
: modifier의 type. 모든 instances들은 같은 값이 uniform variable을 갖는다.
ISPC가 어떤 순서로 task를 수행하는지에 대한 예시 (Abstraction)
![](https://blog.kakaocdn.net/dn/bC5v3Z/btswkpVpndi/PWmRaGzwfXyxHisKdjiVA1/img.png)
ISPC는 실제로는 SIMD instructions를 사용하여 병렬 처리한다. (Implementation)
하나의 gang에 생성되는 instances의 수는 사실 hardware가 지원하는 SIMD width이다. ISPC compiler는 보통 SIMD instructions로 구성된 C++ 함수 바이너리 (.o) 를 생성하고, C++ code 는 이렇게 생성된 object file을 링크한다.
Scheduling: interleaved assignment
각각의 instances들이 붙어 있는 데이터 (contiguous in memory)를 로드 하는 것이 더 효율적이기 때문에 아래와 같이 스케쥴링 하는 것이 더 효율적이다.
![](https://blog.kakaocdn.net/dn/bN01Uj/btswBBAVEsz/OAuGcCkmuTmoZBX9LNKkOK/img.png)
굳이 이렇게 하지 말라는 뜻이다.
![](https://blog.kakaocdn.net/dn/bnx8Wt/btsv8aFl8sr/YIDIp7Vmw1ZJx94cKdW6jK/img.png)
이렇게 될 경우 내부적으로 붙어 있지 않은 (not contiguous in memory) 데이터들을 하나의 벡터로 모아야하기 때문에 다른 instruction을 추가로 수행해야하고 locality도 충족하지 않는다.
foreach 문으로 ISPC의 코드를 더 abstraction 해보자. (Raising level of abstraction with foreach)
![](https://blog.kakaocdn.net/dn/TInH7/btswpYDhUZZ/uVVzXBRdxiLRLIF2iM1mx1/img.png)
foreach
문은 해당 반복문이 parallel 하게 수행되어도 좋다는 것을 알려준다. 즉, ISPC의 gang에게 아래 반복문을 알잘딱 parallel 하라는 의미.
ISPC: Abstraction vs. Implementation
Abstraction: Single Program, Multiple Data programming perspectiv (SPMD)
프로그래머는 하나의 program에 병렬처리가 가능한 부분에 대하여 하나의 gang을 생성하고, 이 안에서 programCount
만큼의 logical instruction streams (instances) 가 각각의 programIndex
를 가지고 수행된다고 생각하여 코드를 작성해야함.
Implementation: Single Instruction, Multiple data (SIMD)
ISPC 컴파일러는 gang에 의해 수행되는 logic들을 처리할 vector instructions을 호출한다.
ISPC 컴파일러는 conditional control flow (e.g. if, else 문) 를 vector instructions에 알잘딱 맵핑한다. (와우..)
ISPC는 abstraction과 implementation 둘 중 하나에 집중해보기 어려움. 둘 다를 고려하여 ISPC 프로그램을 작성하기를 바람.
SPMD summary
![](https://blog.kakaocdn.net/dn/Ulhva/btsv8PVfwWs/ik1c1XfSgc9YrCbdUHvn50/img.png)
단, x86 system에 속한 하나의 코어에서 동작함. (ARM은..) 따라서 앞서 예제로 주어진 코드는 만약에 4개의 코어가 있는 x86 system에서는 하나의 코어에서만 동작함.
ISPC는 다른 abstraction도 있는데, 바로 “task”
이다. 이는 multi-core 수행을 위해 사용된다. (나중에 등장)
Uploaded by N2T