기술

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

CUDA 병렬 프로그래밍 (20121025)

CUDA 병렬 프로그래밍, 정영훈 저, 이한디지털리

5. 메모리 아키텍쳐

  • sum = a1*b1 + a2*b2 + a3*b3 보다 sum=a1*b1 ; sum+=a2*b2; sum+=a3*b3; 가 더 적은 레지스터를 사용한다.
  • 커널 내부에서 사용될 for문의 max값을 커널의 인자로 주기보다는 constant(symbol)로 선언하여 사용하면 스레드마다 사용되는 레지스터 수를 줄일 수 있다.
  • 메모리 결합(Coalescing) 조건 : 최대 밴드 폭을 사용하는 조건
  • G80/G90 조건
    변수가 32/64/128 bit,
    16개의 스레드가 접근하는 메모리가 오름차순으로 근접해야 한다.
    첫번재 스레드가 접근하는 메모리의 주소가 64/128byte 배수의 시작이어야 한다.
  • GT200 조건
    쓰일 메모리 주소를 미리 수집하여 전송하므로 32bit 내부로만 들어가기만 하면 됨.
  • 뱅크 : SM 의 16KB 공유 메모리 는 1KB씩 16개의 메모리 뱅크로 이루어짐
    0번 뱅크부터 4byte 메모리가 배치되어 0번 뱅크 0, 1번뱅크 4, 2번뱅크 8, .. 순의 메모리 주소 위치를 가짐. 각 뱅크마다 한번의 GPU 사이클에 한번 액세스 가능.
  • 따라서 각 스레드가 하나의 뱅크에 단독으로 액세스하면 최적 효율
  • 2차원 블록일 경우, 컬럼 먼저 액세스 한다면 컬럼이 한 뱅크에 모두 들어있어, 각 스레드가 동시에 액세스 하지 못함.
  • 메모리를 1개 더 패딩하여 선언함으로 다른 뱅크에 들어가도록 선언하면 피할 수 있음
  • 록 메모리는 항상 RAM 에 유지되는 메모리로 스트림에 사용됨, MallocHost로 선언
  • Pinned system memory 는 cudaHostAlloc으로 선언, GPU 메모리 포인터가 Host 메모리를 가리키도록 선언할 수 있음.

 


Add a Comment Trackback