inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Lập trình CUDA (4) - Tính toán song song C/C++/GPU - Nhân ma trận matrix

23-1 transpose, phiên bản thiết bị - Tìm ma trận chuyển vị, phiên bản thiết bị CUDA (bao gồm tệp PDF cho toàn bộ phần)

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

Đã giải quyết

384

LongLong

4 câu hỏi đã được viết

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 병렬-처리

Câu trả lời 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

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

삼성 코테 없어짐

0

8

0

섹션7에서 개념적 궁금증

0

6

0

26년2회 실기기출은 언제쯤...

0

27

2

이론 공부법 요약본 버전 업데이트 문의

0

24

2

코딩살구클럽 가입부탁드립니다

0

29

2

vs 디버그 옵션 설정

0

26

2

코딩살구클럽 가입 요청 확인부탁드립니다

0

31

2

54강 양자화의 끝판왕, 터보퀀트 (예정) 강의 업로드

0

30

1

블로그에 학습 내용 올려도 되나요?

0

33

1

5-S 테스트 케이스 질문

0

36

2

정처기 필기 준비할때 이 이론을 다시 외워도 될까요?

0

55

2

코살 문제풀이 환경

0

49

2

2 - T 오큰수 문제가 있는 것 같습니다.

0

43

1

추천 추가문제들

0

43

2

프로그래머스 코테 환경 관련해서 질문드립니다.

0

48

2

최댓값 구하기(서바이벌)에서 수식 구성에 대한 질문

0

42

2

자료 한번에 다운받기

0

32

1

해당 문제에 대한 채점이 코딩살구클럽에서 올바르게 처리되지 않습니다.

0

44

2

균형 이진 트리 설명 시 높이 숫자

0

32

2

4-H 질문드립니다.

0

36

2

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

0

153

2

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

0

160

2

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

0

245

1

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

0

363

1