inflearn logo
강의

Course

Instructor

CUDA Programming (4) - C/C++/GPU Parallel Computing - Matrix Multiplication

23-1 transpose, device version - Finding the transpose matrix, CUDA device version (including the entire section PDF file)

global memory를 사용한 matrix copy 대비 global memory를 활용한 matrix transpose가 속도가 느린 이유가 궁금합니다.

Resolved

360

LongLong

4 asked

0

안녕하세요.

먼저 좋은 강의 감사드립니다.

 

아래 소스는 matcpy-dev.cu에서 가져온 kernel 함수입니다.

global void kernelMatCpy( float* C, const float* A, int matsize, size_t pitch_in_elem ) {

register unsigned gy = blockIdx.y * blockDim.y + threadIdx.y; // CUDA-provided index

if (gy < matsize) {

register unsigned gx = blockIdx.x * blockDim.x + threadIdx.x; // CUDA-provided index

if (gx < matsize) {

register unsigned idx = gy * pitch_in_elem + gx; // in element

C[idx] = A[idx];

}

}

}

 

그리고 다음 소스는 transpose-dev.cu에서 가져온 kernel 함수 입니다.

global void kernelMatTranspose( float* C, const float* A, unsigned matsize, size_t pitch_in_elem ) {

register unsigned gy = blockIdx.y * blockDim.y + threadIdx.y; // CUDA-provided index

if (gy < matsize) {

register unsigned gx = blockIdx.x * blockDim.x + threadIdx.x; // CUDA-provided index

if (gx < matsize) {

register unsigned idxA = gy * pitch_in_elem + gx;

register unsigned idxC = gx * pitch_in_elem + gy;

C[idxC] = A[idxA];

}

}

}

 

메모리 접근 관점에서 보면 각 thread별로 A에서 read해서 C에 write하는 동일한 과정으로 보이는데, 결과는 속도 차이가 많이 나는 정확한 원인이 궁금합니다.

memory coalescing 때문으로 추정하고 있는데, 맞는 생각일까요?

감사합니다.

c c++ cuda gpu 병렬-처리

Answer 1

0

onemoresipofcoffee

안녕하세요.

이후 강의에서도 계속 나오게 됩니다만, CUDA는 물론이고, 일반적인 C, C++ 코딩에서도 memory coalescing 문제는 전체 시스템의 성능을 대폭 떨어뜨립니다.

위 예제에서도, transpose 연산이 얼핏 보기에는 matrix 원소 하나 하나를 재배치하는 것 뿐이라고 보이지만, 실제로는 main memory 에서든, CUDA 의 global memory 에서든, memory access 시에는 memory access 순서에 따라서, 성능 차이가 꽤 나게되고, 예를 들어, A번지, A+1번지, A+2 번지 처럼, 연속된 메모리 영역을 access 하는 것과, 꽤 떨어진 메모리 영역을 access 하는 것은 cache fail 부터, DRAM 의 구조 등으로 성능 차이가 꽤 납니다.

CUDA 코딩의 많은 부분은 메모리 access 패턴을 최적화하는 부분을 포함하게 되고, 이후 동영상에서도 많은 설명이 나오게 됩니다. 이부분은 CUDA 만이 아니고, 기존의 C, C++ 코딩에도 해당되는 내용입니다.

감사합니다.

 

0

LongLong

상세하고 빠른 답변 감사드립니다.

Reticle이 안나옵니다.

0

7

1

진행 방법 질문드립니다!

0

26

2

Singleton 관련 질문입니다.

1

27

2

안녕하세요. 계속 프로젝트를 해야지 하다가 결제하고 환경 설정 중입니다.

0

14

1

Export template 안됨

1

26

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

54

2

AddGameFrameworkComponentReceiver vs AddExtensionHandler

0

24

0

scanf("%d\n") 의미

0

20

1

필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)

0

37

2

2주차 개념#12 트리 순회

0

25

2

백준 사이트 서비스 종료

0

111

3

26년 1회 실기 해설 강의

0

51

2

프로젝트 질문 문의

0

45

1

주소 연산자(&) 간접 지정자(*) 반대 개념

0

33

1

53번 4-1 자료 오류 있는 것 같습니다.

0

68

2

7번문제

0

57

2

C언어 변형문제 9번문제 Pdf 수정요청

0

45

2

메서드 오버드라드

0

45

2

실수

0

45

1

백준사이트가 종료된다고 합니다.

0

284

2

24-2 3중 for loop 개선책 이해가 가지 않습니다.

0

124

2

transpose-shared.cu 가 느린 이유에 대해서 질문 있습니다.

0

129

2

kernelMatCpy에서는 __syncthreads가 필요없지 않나요

0

222

1

소스 코드 에러 문의 드립니다

0

341

1