해결된 질문
작성
·
321
0
안녕하세요. 강의 정말 너무 잘 보고 있습니다!!
다름이 아니라 28-4 강의를 보다 궁금하게 있어서 질문을 드립니다.
even odd방식이 Half and Half 알고리즘보다 느린 이유
Global Memory에서 Half and Half가 even odd보다 더 느린 이유
위 두 가지 이유에 대해서는 이해가 되었지만, Shared Memory를 사용하는 부분에서 이해가 잘되지 않는 부분이 있습니다. Global Memory에서는 Memory Coalescing이 중요하기 때문에 Half and Half가 더 느린게 맞지만, Shared Memory를 사용하는 부분에서는 두 방식(even odd, Half and Half)에서 차이가 없지 않을까 하고 생각했습니다. 두 방식 모두 Global Memory에 접근하고 Write하는 로직은 같기 때문에 Shared Memory에서 성능을 저해하는 요소로는 Bank Conflict만 있다고 생각했는데, 제가 잘못 이해 하고 있는 걸까요??
답변 1
1
안녕하세요.
우선, CUDA 프로그래밍 강의를 수강해 주셔서 감사합니다.
28-4 동영상에서 나왔던 내용은 상당히 디테일하게 속도를 따지는 부분이었습니다.
메모리 억세스 속도만 따진다면, 말씀하신 대로, 쉐어드 메모리에 가져온 후에는,
쉐어드 메모리 상에서 even-odd 를 쓰거나, half-and-half 를 쓰거나,
메모리를 읽어오는 속도에서는 큰 차이가 없을 겁니다.
bank conflict 도 어느 한쪽이 엄청 빨라질 정도로 발생할 것 같지는 않습니다.
다만, 28번 강의의 주제가 "control flow" 로, 메모리 억세스 보다는
GPU core 의 수행 경로를 따지고 있는 상황이라서,
control-flow 레벨에서의 최적화를 고려하고 있습니다.
28-1 동영상의 2808 슬라이드를 보시면, (28-1 동영상에서는 8:05 부분의 앞뒤 정도가 됩니다)
even-odd 방법은 대부분의 경우, 1개의 warp 내에서도 if-part, else-part 가 모두 수행되어야 하고,
half-and-half 방법에서는 1개의 warp 내에서는 대부분 if-part 만, 또는 else-part 만 수행하게 될 것입니다.
warp 1개의 입장에서는 몇 개의 instruction 을 더 수행할 것인가, 말 것인가의 차이가 됩니다.
예제로 사용한 CUDA kernel 들은 단순히 assignment 문장 1,2개를 수행하는 정도라서,
warp 입장에서는 GPU core instruction 2,3개 정도를 더 수행하느냐 정도가 될 것 같습니다.
그래서, 현재 구현 결과에서는 미미한 차이를 보이는 정도가 나왔습니다.
(28-4 동영상의 24번 슬라이드, 7,808 usec 대 7,747 usec )
다만, if-part 와 else-part 가 상당히 heavy 해 진다면?
이야기가 달라질 수도 있습니다.
그래서, 동영상에서도, 혹시 모르니까, 습관적으로 half-and-half 방식으로
알고리즘을 설계/구현 하는 것이 나을 것이라고 했던 것입니다.
종합적으로 보면, 현재의 구현 에서는 미미한 차이를 보이는 게 맞습니다.
다만, heavy 한 알고리즘을 구현한다면, 경우에 따라서 차이가 커질 수도 있기 때문에,
되도록 half-and-half 를 선호하게 된다고 보시면 될 것 같습니다.
감사합니다.
자세한 설명 감사합니다.