2013-07-02 1 views

답변

2

저는 실제 CUDA 컴파일러와 그 단계에 대해 많은 통찰력을 줄 수는 없지만 CUDA의 실행 아키텍처를 기반으로 한 상식적인 추론을 제공합니다.

최대 레지스터 번호를 설정하지 않으면 컴파일러는 대상 레지스터 번호가 무엇인지 알지 못하며 최대한 적은 수의 레지스터를 사용해야하거나 다른 경험적 방법을 사용한다고 가정해야합니다. 일반적으로 스레드 당 레지스터 사용량을 최소화한다는 것은 단일 코어에 더 많은 스레드를위한 레지스터가 충분하다는 것을 의미하므로 더 많은 스레드 블록이 단일 코어에 상주 할 수 있기 때문에 활용도가 극대화된다는 것을 의미합니다.

그러나 최대 레지스터 사용량을 제공하면 컴파일러는 이것이 최대 값이라는 것을 알고 가능한 한 많은 레지스터를 사용할 수 있다고 가정합니다. 그 이유는 레지스터 점유가 너무 높고 또 다른 스레드 블록을위한 레지스터가 충분하지 않기 때문에 실제로는 하드 한계입니다. 하나의 쓰레드가 65 개의 레지스터를 사용하면 또 다른 블록을위한 충분한 레지스터가 없을 때, 65를 사용하지 않는 한 63 또는 64 개의 레지스터를 사용하는지는 중요하지 않습니다. 따라서 컴파일러는 다음과 같이 사용하려고합니다. 가능한 한 많은 레지스터 (물론 최대까지)가 필요합니다. 레지스터는 얻을 수있는 가장 빠른 메모리 유형이기 때문에 바람직합니다. 그러나이 추론은 컴파일러가이 하드 한도를 알고있을 때만 적용 할 수 있습니다. 그렇지 않으면 항상 최적이 아닌 일부 휴리스틱을 사용해야합니다.

48 레지스터가있는 버전이 47보다 빠른 이유는 더 많은 레지스터를 사용하기 때문일 수 있습니다. 사용 가능한 레지스터가 충분하지 않으면 데이터를 로컬 메모리로 스왑 아웃하거나 다른 레지스터의 임시 레지스터에 반복적으로 복사해야합니다. 이 모두가 완벽한 의미가 결국

때문에 당신이 ( 당신의 최적의 레지스터의 최대 값을 설정하여) 컴파일러를주는 자세한 내용은 최적화 할 수 있습니다 더 나은 그리고보다 효율적인 해야 결과 코드. 특히 GPU 컴퓨팅의 경우 커널을 실제 하드웨어와 리소스에 맞게 최대한 조정하는 것이 좋습니다.

+2

우수한 분석 및 설명. 그러나 왜 그 로컬 메모리가 실제로 "글로벌 메모리만큼 나쁜 것인가?"라는 말은 당신이 얻을 수있는 최악의 상황입니까? 내가 아는 한 로컬 메모리는 L1 캐시 회로 (적어도 Fermi와 Kepler의 경우)에서 만들어 지므로 전역 메모리보다 높은 대역폭과 빠른 액세스 속도를 나타냅니다. – JackOLantern

관련 문제