- 메모리 타이별 특성.

  1. 레지스터 

     - 쓰래드 내부에서 몇 개를 사용하는지는 알 수 없다. 다만 툴을 이용해서 확인은 가능.

     - 단항연산을 할수록, 사용하는 레지스터 갯수는 줄어든다.

     

              

  2. 로컬메모리

    - 쓰레드 로컬에서 사용
    -  제한된 레지스터 개수를 초과하면 로컬 메모리에 할당된다.
    - 레지스터냐, 로컬이냐 할당 기준은 명확하지 않다.

  3. 공유메모리 Shared Memory

       



      - 소개 : 블록내 할당된 쓰레드 간에 공유되는 메모리.
      - 특성 :
           - SM과 인접하기 때문에, 메모리양이 적고, 속도가 빠르다.
           - 워프에 의해 영향을 받는다.
           - 같은 크기의 메모리를 32개 가진다.  뱅크 갯수는 Compute ability 테이블을 참조한다.  = 32개. 보통 warp 갯수와 동일하다고 한다.
           - 병행성을 위해, 메모리 뱅크 개념을 알아야 함.
           - 뱅크 내 메모리 단위는 4byte/8byte 로 구성할 수 있고. API로 설정 가능하다.

           - 동기화. 필요.
               __synchthread();

      - 선언.
         1. __shared__ float tile[size_y][size_x]; 
         2. extern __shared__ int tile[];  
             - 사이즈가 결정되지 않았을 때 사용한다.
             - 커널 함수를 호출할 때 명시하면 된다.  kernel<<<grid, block, shared_memory_size>>>(....);                            

         3. 커널내부, 외부에서 선언할 수 있다. 

    
      - 메모리 뱅크 
        - 메모리 밴드를 최대한 활용 목적으로  병행성을 극대화 하기 위해, 같은 크기의 메모리 블록을[64K/ 32[뱅크갯수] ] 32개 가진 메모리 모듈를 뱅크라고 한다.       
        - 계산식 : 뱅크 수 32개. 
                 1 열은 32 * 4 바이트 = 128 BYTE
                 2. 한 열의 뱅크 크기[4바이트 / 1블록  크기] =  1024 * 64  / 128  = 512개.     

                   0번 스레드 -->뱅크 0   [ 0 BYTE] [128BYTE]  ~~~~
                   1번 쓰레드 --> 뱅크 1  [4 BYTE][132BYTE ]
                     ~~
                  31번 쓰레드 --> 뱅크 31 [ 124 BYTE][252BYTE]


         - 관련 이슈: 뱅크 충돌.
             - 2개 이상의 쓰레드가 동시에 하나의 뱅크에 접근하려고 했을 때 뱅크 충돌이라고 한다.
             - 뱅크 충돌시, 처리는 순차적으로 이루어지기 때문에,   1/ 충돌횟수 만큼 성능이 떨어지게 된다.


      - 동기화.
          1. 공유메모리는 비동기적으로 처리가 되기 때문에, 동기화 작업이 필요하다.
          2. __synchthreads() 를 통해 동기화가 이루어진다.                     
              

  4. 글로벌 메모리.

     -  디바이스의 DRAM을 말한다.
     -  cudaMalloc() 호출시 할당되는 메모리.


  5. 상수 메모리.

     -읽기 전용. / 캐쉬 지원 
     - 호스트영역: 쓰기전용
     - 디바이스영역: 읽기 전용.

     쓰기 예)
       __constant__ int cData[6];
       
       int aData[6] = {1, 2, 3, 4, 5, 6};
      cudaMemcpyToSymbol ("cData",&aData,sizeof(aData));

       

  6. 텍스트 메모리.

    2.2 이후로 지원안함.


   


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

스트림.  (0) 2017.01.04
고정 메모리와 제로 메모리 그리고 포터블 메모리.  (0) 2017.01.03
CUDA 컴파일 옵션.  (0) 2017.01.03
쓰레드 ID 구하기.  (0) 2016.12.29
Nsight - Performance Analysis  (0) 2016.12.29

+ Recent posts