본문 바로가기

Cuda

(8)
C++ Cuda parallel reduction strategy 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 #include..
C++ CUDA Warp 발산 CUDA 연산 시 그래픽카드의 warp size 만큼 동일한 병렬 연산이 이루어 진다. (오해의 소지가 있으니 자세히 말하자면, GPU의 코어 숫자 만큼 병렬 연산이 이루어 진다. 내 그래픽 카드인 RTX2070 super의 코어 수는 2560개 이므로, 최대 2560개의 코어를 동시에 사용할 수 있다. warp_size는 동일 연산이 일어나야 하는 권장 코어 숫자라고 생각하면 쉽다. 2560 / warp_size = 80 이다. 따라서 동시에 80개의 warp들이 병렬 연산이 가능 한데, 80개 중 각각의 warp 에서는 동일 연산이 이루어져야 되는게 좋다는 뜻이다.) 우리가 평소에 잘 사용하는 NVIDIA GTX/RTX nvidia 계열의 그래픽 카드는 warp size가 32다. 만약에 gpu 내부..
C++ Cuda 시스템 정보, GPU 정보 불러오기 cuda 프로그래밍 시, 내 그래픽카드의 스펙을 아는 것은 상당히 중요하다. 그래픽카드 스펙에 따라서 grid size, block size를 효율적으로 정할 수 있기 때문이다. 참고로 multiProcessorCount * warp_size 만큼이 최대로 동시에 실행 가능한 코어 숫자이다. 내 경우에는 그래픽카드로 RTX2070super를 사용하고 있는데 multiProcessorCount는 80이고, warp_size는 32다. 따라서 2560개의 코어에서 동시 실행 가능하다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ..
C++ Cuda CPU와 GPU에서의 연산 속도 비교하기 CPU와 GPU에서의 연산 속도 비교하기 GPU에서의 속도가 400배 이상 빠르다. 덧셈 연산에서 인텔 I7 CPU에 비해 RTX 2070 super 가 400배 이상 빠름을 알 수 있다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 9..
C++ Cuda 메모리 할당에서의 예외 처리 Cuda 프로그래밍에 있어서 메모리 할당 시에는 예외 처리를 잘 해야 한다. 사소한 메모리 관리를 놓치면, 프로젝트가 망가질 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 10..
C++ Cuda GPU에서의 더하기 연산 C++ Cuda GPU 에서의 더하기 연산 __global__ 이 붙은 함수 내부는 gpu 단에서 돌아가는 연산이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 #include "cuda_runtime.h" #inclu..
C++ CUDA 문제 2. CPU에서 GPU로 데이터를 전달하여 3차원 공간에서 병렬 실행하기 주의할 점은 cudaMalloc을 사용할 시, 함수 인자로 이중포인터(void**(&d_data))를 넘겨야 한다. 사람들이 왜 cudaMalloc을 사용할 시 이중포인터를 함수 인자로 넣어야 하는지 궁금해 하는 경우가 많다. 간단하게 이유를 설명 하자면 d_data의 주소(&d_data)는 cpu main 함수 스택에 저장 된다. cudaMalloc((void**)&d_data, array_byte_size) 에서는 gpu 내에 d_data 값에 동적 메모리 할당을 하고, 이후 gpu 내에서 d_data 값이 새롭게 지정되며, 이 메모리에서 gpu 연산이 되기 때문이다. 그렇지만 d_data의 주소(&d_data)는 cpu main 함수 스택에서 처음과 같이 유지된다. 따라서 이중 포인터를 사용하면, ..
C++ Cuda 문제 1. Thread index, Block Index, Grid Index 출력하기 문제 : Grid가 X,Y,Z 방향으로 4차원의 쓰레드를 가지고 있으며, Grid 안의 Block은 X,Y,Z 방향으로 각각 2차원의 쓰레드를 가지고 있다. 이 경우에 threadIdx, blockIdx, gridDim을 출력하는 프로그램을 작성하시오 정답 : #include "cuda_runtime.h" #include "device_launch_parameters.h" #include __global__ void print_Idx_Dim() { printf("threadIdx.x : %d, threadIdx.y : %d, threadIdx.z : %d\n", threadIdx.x, threadIdx.y, threadIdx.z); printf("blockIdx.x : %d, blockIdx.y : %d..