Programming/CUDA

[CUDA] Constant Memory 와 이벤트

wawawaaw 2023. 5. 2. 02:09
반응형

이번 포스팅에서는 constant memory를 활용하여 어플리케이션 성능을 향상시킬 수 있는 방법에 대해서 다룬다. 

또, event라는 것을 활용하여 어플리케이션의 성능을 평가할 수 있는 방법을 다룬다. 

 

Constant Memory 

  • constant memory 라는 이름과 같이, 변하지 않는 값의 변수에 대한 정보를 저장하는 메모리이다. 
  • NVIDIA 하드웨어에서는 64kb의 constant 메모리를 제공한다. 
  • 앞에 __constant__ 키워드를 활용하여 선언할 수 있다. 
__constant__ SomeStruct s[S];
  • 이렇게 된다면 cudaMalloc 또는 cudaFree를 해줄 필요가 없다는 장점이 있다. 

 

Constance Memory를 사용했을 때의 performance

  • constant 메모리를 64kb의 constant 메모리에 저장했을 때 왜 global memory에서 읽었을 때보다 좋을까? 
    • cache로 되어 있기 때문에 memory traffic이 없다.
    • 주변 thread 에 broadcasting이 가능하다. 여기서 주변이라는 것은 warp를 의미한다.
      • warp란? 같이 실행되는 32개의 thread 묶음을 의미한다. 
      • broadcasting은 이 warp의 절반 정도까지 가능하다. 
      • 16개의 thread가 모두 같은 주소를 읽을 때에는 퍼포먼스가 향상된다. 
      • 단, 16개의 thread가 각기 다른 주소를 참조하고자 할때는 퍼포먼스가 크게 떨어질 수 있다. 
        • broadcasting을 위한 16번 만큼의 작업이 필요하기 때문이다. 따라서 이 경우에는 global memory 보다 느릴 수 있다. 

Event로 퍼포먼스 알아보기

  • event는 GPU time stamp이다. cpu timer로는 측정할 수 없는 값들을 측정할 수 있도록 도와준다. 
  • 다음과 같이 사용 가능하다. 
cudaEvent_t start; 
cudaEvent_t end;

cudaEventCreate(&start); 
cudaEventCreate(&end);

cudaEventRecord(start,0);
//작업
cudaEventRecord(end,0);
cudaEventSynchronize(end);
  • cudaEvent_t : 로 time 을 담을 변수 선언
  • cudaEventRecord
  • cudaEventSynchronize 
  • cudaEventElapsedTime : cudaEvent_t 변수 들 간 시간 얼마나 지났는지 계산해주는 함수.
  • cudaEventDestroy : 생성한 변수 제거 , 삭제
반응형