이제 CUDA를 이용해 대규모 벡터를 더해보자. 앞에서 계속 봐왔던 로직이지만, 이제 N의 개수가 256M개에서 많게는 1G개로 늘어난 배열에 대한 계산을 수행할 것이다. 📂 giga-add-host.cpp 먼저, host(CPU)에서 for-loop를 이용해 실행한 코드와 결과를 확인해보자. SIZE가 256MB인 경우이다. 코드 #include "./common.cpp" const unsigned SIZE = 256*1024*1024; // big-size elements int main(void){ ... //kernel: vector addition ELAPSED_TIME_BEGIN(0); for(register unsigned i=0;i
앞선 포스팅에서 했던 1차원 배열의 합을 구하는 것을 배열의 크기를 매우 키우고, CPU와 CUDA를 사용했을 때의 실행 시간을 비교해보자. 📂 vecadd-host.cpp SIZE가 1024*1024인 배열에 값을 넣기 위해 rand() 함수를 이용하자. #include "./common.cpp" // set random value of [0.000, 1.000) to dst array void setRandomData(float* dst, int size){ while(size--){ *dst++ = (rand()%1000)/1000.0F; } } // get total sum of dst array float getSum(float* dst, int size){ register float sum =..
CUDA 커널 실행에 대해 알아보자. 📂 Process and Thread 🏷 Process(프로세스) Program을 작성한 뒤, 그것을 실행시킨 instance를 말한다. 독립적인 데이터 공간을 확보하고 있다. 즉, Data 영역은 프로세스마다 할당된다. 🏷 Thread(스레드) Program은 한 개이지만, 내부적으로 여러 개의 독립된 Control flow를 가진 것을 말한다. 스레드끼리는 데이터 공유가 가능하다. 프로세스와 스레드는 OS에 의해 지원된다. 위 그림은 1개의 프로세스에 여러 스레드가 있는 상황과 여러 프로세스에 여러 스레드가 존재하는 상황을 보여준다. 예를 들어, 웹 사이트 안에서 여러 개의 탭을 이용해 여러 site가 동작되는 것은 프로세스가 여러 개 동작하는 것이고, 이 웹 브..
우리는 두 가지 버전의 프로그램을 실행시키는데, 하나는 CPU 기반의 순차 처리(CPU-based sequential execution), 또 다른 하나는 CUDA 기반의 병렬 처리(CUDA-based parallel execution)이다. 이 둘의 실행 시간을 비교할 수 있는 방법에는 어떤 것이 있을까? 이때 elapsed time을 사용하여 비교하는데, 실행 시간을 측정하는 방법은 다음과 같다. 현재 시간을 기록할 수 있는 방법을 통해 시작 시간을 설정 / start time = current time job 실행 실행이 끝나는 시간을 설정 / end time = current time 이 둘의 차이(Elapsed time = end time - start time)가 총 실행된 시간을 의미한다. ..
간단한 CUDA kernel 예제와 함께 에러 처리에 대해 알아보자. 🏷 add_kernel 예제 SIZE가 8이고 1차원 A 배열에 1.0을 더한 값을 B 배열에 넣는 커널 함수이다. //CUDA Kernel function __global__ void add_kernel(float* b, const float* a){ int i = threadIdx.x; b[i] = a[i] + 1.0f; } 나중에 host의 main함수에서 add_kernel(dev_b, dev_a)를 통해 kernel call을 할 것이다. main함수는 다음과 같다. int main(void){ const int SIZE = 8; const float a[SIZE] = {0.,1.,2.,3.,4.,5.,6.,7.,} float..
📄 Single CPU 이전에 포스팅했던 Single CPU 기반의 Vector addition을 보면 다음과 같다. CPU는 1개의 코어를 가지고 있는 상태이고 time 0, time 1, time 2... 와 같이 시간을 달리하여 순차 처리를 한다. 📄 many-core GPU 다음은 many core인 GPU에서의 동작을 보자. core#0, core#1 ... core#(n-1)과 같이 N개의 코어를 모두 사용하여 time 0에 addition을 끝낼 수 있다. 📂 Scenario : CUDA vector addition 그럼 이 CUDA Vector addition의 시나리오를 보자. 총 5개의 step으로 동작된다. 1️⃣ Host-side host에서 source data인 A, B 배열과 ..