Front-end_dev

Control flow 본문

Parallel processing

Control flow

Eat2go 2018. 11. 21. 14:43

Streaming multiprocessor당 32개의 core와 Control unit은 1개가 존재한다. 이말은 32개 core를 전부 실행하냐 전부실행하지않느냐로 볼 수 있다.

Control unit이 1개밖에 존재하지않기떄문에 특정 core의 ALU에만 신호를 보낼 수 가 없기떄문. 즉, if-else로 분기가 되어있다하더라도 모든쓰레드가 다 if-else 두개의 분기를 전부 실행하게된다.

하지만 실제 코드를 작성하고 실행해보면 결과가 우리가생각하고 코딩했던것과 일치하게되는데, 조건에맞지않은 쓰레드가 그 scope영역내의 코드를 실행했을떄 ALU까지는 수행되지만 write-back이 되지않기때문에(저장을 하지않기떄문에) 문제가 되지않던것이였다. 결국 clock cycle이 낭비되고있다는말.


그래서 clock cycle을 낭비하고싶지않다면 각 warp가 전부 같은 분기문을 수행하게끔 해야한다. Cuda compiler는 각 warp가 같은분기문을 수행하면 다른 분기문을 수행하지 않게끔 어셈블리레벨에서 코드가 수정되는듯하다


if-else분기말고 for-loop에서도 이러한 issue가 존재하는데, 각 쓰레드는 서로다른 iteration number를 가질 수 있다. 예를들어 총 쓰레드 2개가있는데 쓰레드1은 for(int i=0;i<5;i++){} 쓰레드2는 for(int i=0;i<10;i++){} 가 있다고 하면, 두개의 쓰레드 모두 10번의 iteration을 갖게된다. 하지만 위에서 설명했다시피 1번쓰레드같은경우는 write-back을 하지않기때문에 실제 값이 저장되는 instruction 같은경우는 5번의 iteration까지만 허용된다.




결론은 cycle 낭비를 하지않으려면 각 warp가 서로 같은 분기를 갖게끔해야한다 근데 사실성능차이를 크게 보진못한다. bank conflict(이글 주제와는 다른 issue)도 마찬가지...