wawawaaw
안녕하세요
wawawaaw
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • Programming (13)
      • Debugging (0)
      • Linux (5)
      • CUDA (5)
      • Git (1)
    • AI Research (14)
      • Tracking (2)
      • Object Detection (9)
      • Dataset (1)
      • GPU (2)
    • Paper Review (1)
    • 보안 (2)
    • Book Review (0)
    • Etc. (2)
      • 자격증 (1)

인기 글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
wawawaaw

안녕하세요

[CUDA] CUDA로 threading &  shared memory
Programming/CUDA

[CUDA] CUDA로 threading & shared memory

2023. 5. 2. 00:48
반응형

Parallel Blocks 나누기

  •  cuda에서는 parallel로 실행되는 이 block들을 thread로 나눌 수 있는 방법을 제시한다. 
  • 본 포스팅에서는 어떻게 thread로 block들을 나누어볼 수 있는지 splitting 방법에 대해서 다룬다. 
  • 이전 포스팅에서 다음과 같은 kernel call 에 대해서 첫번째 인자가 block의 수 라고 했었다. 
    • kernel <<<number_of_parallel_blocks, threads per block>>> 
    • 두번째 인자는 block 당 돌리고 싶은 thread의 수를 의미한다. 
    • 예를 들어 add<<<1,N>>> (dev_a,dev_b,dev_c) 하게 되면 하나의 블록에 n개의 thread가 돌아가도록 설정한 것이다.

MaxThreadsPerBlock 

  • 주로 block의 개수에는 한계가 있는데 일반적으로 한번의 실행에 65,535개 라고 한다.
  • block에 실행할 수 있는 thread의 수도 512개로 한정이 되어 있는 경우가 많다. 
  • 따라서 512보다 많은 양의 thread를 돌리고 싶은 경우는 block과 thread를 이용한 계산이 필요하다.
int tid= threadIdx.x +blockIdx.x*blockDim.x;
  • blockDim : 블록의 크기 
  • blockIdx: 블록의 index 번호
  • threadIdx.x : 블록 내 thread의 번호 
  • 이차원 배열의 개념으로 생각하면 쉽다. 

  • 예시 
    • N개의 thread가 있다. 
    • 블록 당 128개의 thead를 실행하고 싶다면? 
add <<<(N+127)/128,128>>> (dev_a, dev_b,dev_c);

 

Shared Memory and Synchronization 

  • cuda는 shared memory 가 있다!
  • __shared__ 를 활용하여 shared memory 에 variable을 둘 수 있다. 
  • block의 thread끼리는 공유할 수 있으나, 다른 block에서는 접근할 수 없다. 
  • 물리적으로 gpu에 가깝기 때문에 접근 시간이 빠르다는 장점이 있다. 
  • 그런데 여느 shared memory 와 같이 synchronization 에 주의해서 race condition이 발생하지 않도록 해야한다. 
  • dot product 예시 
#define imin(a,b) (a<b?a:b) 

const int N=33*1024; 
cont int threadsPerBlock =256; 

__global__void dot(float* a, float* b, float* c){
	__shared__ float cache[threadsPerBlock];
    int tid = threadIdx.x + blockIdx.x*blockDim.x; 
    int cacheIndex = threadIdx.x; 
    
    float temp =0 ; 
    
    //곱한 값 저장
    while(tid<N){
    	temp+=a[tid]*b[tid];
        tid+= blockDim.x*gridDim.x; 
        }
    cache[cacheIndex]= temp;
    
    __synchthread(); 
    
    //곱한 값들 더하기 
    int i = blockDim.x/2;
    while(i!=0) { 
    	if(cacheIndex <i) 
        	//reduction 방법으로 더하기를 반으로 나누어 가며 진행
        	cache[cacheIndex] += cache[cacheIndex+i];
            
        __synchthreads();
        i/=2;
   }
   
   //결과 값 저장 
   if(cacheIndex==0) {
	c[blockIdx.x]=cache[0];
  • __shared__ 를 이용해서 shared memory 에 저장할 변수를 선언했다.
  • __synchthreads() : 다음으로 넘어가기전 block의 모든 thread가 실행될때까지 기다리는 명령
  • 결과는 global c variable에 저장 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Programming > CUDA' 카테고리의 다른 글

[CUDA] Constant Memory 와 이벤트  (0) 2023.05.02
[CUDA] Parallel Programming in CUDA  (0) 2023.05.01
[CUDA] CUDA C 기초  (0) 2023.05.01
[CUDA] GPU Programming을 하는 이유  (0) 2023.05.01
    'Programming/CUDA' 카테고리의 다른 글
    • [CUDA] Constant Memory 와 이벤트
    • [CUDA] Parallel Programming in CUDA
    • [CUDA] CUDA C 기초
    • [CUDA] GPU Programming을 하는 이유
    wawawaaw
    wawawaaw
    안녕하세요.

    티스토리툴바