• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

28-4 shuffle shared - shared memory 강의에서 질문이 있습니다.

23.03.06 21:34 작성 조회수 269

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 를 선호하게 된다고 보시면 될 것 같습니다.

 

감사합니다.

박 신석님의 프로필

박 신석

질문자

2023.03.07

자세한 설명 감사합니다.