무조건이라고 말할 수는 없지만,

 

CPU 프로그래밍(걍 평소 코딩)을 할 때에는 전역변수의 사용은 자제하고 지역변수의 사용을 최대화 시켜야만 했다.

 

왜냐, 전역변수는 프로그램이 실행되는 동안 계속 메모리를 차지하고 있고,

        지역변수는 메서드가 종료되는 순간 소멸되기 때문에

 

하지만,

우리의 GPU는 그렇지 않다. 메모리의 속도 자체가 전역메모리가 더 빠르기 때문에, 지역메모리보다는 전역메모리를 사용해야한다, 물론 공유메모리나 레지스터를 사용하는 방법이 가장 좋은 방법이다.

 

그럼, 전에 썼던 것 처럼,,

가장 빠른 메모리인 레지스터만 사용하다보면 레지스터에 트랜잭션들이 밀리고 밀린 트랜잭션들이 병렬처리가 아닌 순차처리되는 상황이 생기기 때문에 성능이 되려 느려진다고 했다.

 


이렇게 레지스터가 사용량이 많아지면 어떻게 극복하면 될까?

1. SM당 스레드 활성화 비율을 약간 떨어뜨려 메모리 접근 횟수를 늘린다

  - 이렇게 되면 레지스터를 작은단위의 스레드가 자주 사용하게 된다.

  - 느린 지역메모리에 할당하는 것 보다는 좀 밀려도 레지스터를 자주 사용하는 것이 더 좋다.

  - 작업량을 나눈다고 생각하면 이해가 된다잉

 

2. 컴파일러에서 각 스레드 당 사용할 레지스터의 수에 제한을 두어 SM당 스레드 활성화 비율을

   최대로 하여 지역메모리를 사용하는 경우

  - 스레드마다 사용할 레지스터에 수를 제한을 걸면 정해진 레지스터만 사용하기 때문에 순차

     처리 비율이 떨어진다.

 

컴파일러에 의해 각 스레드당 실정되는 지역메모리는 전역메모리상에 할당되어 전역메모리의 트랜잭션과 동일한 전송패턴으로 접근한다.

 

지역메모리는 레지스터에 비해 너무 느리기 때문에 지역메모리 접근이 반복해서 일어난다면 활성화 비율을 떨어뜨리더라도 레지스터를 사용하는게 더 효과적이다.

 

다수의 트랜잭션이 있다면,,

공유메모리를 트랜잭션 버퍼처럼 사용하여 트랜잭션의 수를 줄인다.

그리고, 메모리 접근시 텍스쳐 유닛을 사용하여 성능향상을 노린다.

Posted by 긍정왕오킹