일반적으로 워프 점유를 늘리기 위해 스레드 당 레지스터 압력을 낮추면 워프 레벨 멀티 스레딩 (TLP)을 통해 대기 시간을 숨길 수있는 기회가 더 많아집니다. 레지스터 압력을 줄이려면 스레드 로컬 메모리 당 또는 스레드 블록 공유 메모리 당 더 많은 것을 사용하십시오. CUDA nvcc 컴파일러는 쓰레드 당 더 적은 수의 레지스터를 사용해야 할 수도 있습니다. 이러한 접근법은 양호한 산술 대기 시간, 즉 메모리 r/w 액세스 요청에 대한 ALU 연산의 비율이 높은 작업 부하에 유용하다. 그러나 계산이 거의없고 빈번한 메모리 액세스가있는 대기 시간이 중요한 응용 프로그램의 경우이 방법은 실제로 성능을 저하시키는 경향이 있습니다.CUDA에서 스레드 당 레지스터 사용량 증가
대기 시간이 중요한 응용 프로그램의 경우 온칩 레지스터 또는 공유 메모리에서 최대한 많은 데이터를 가져온 다음 가능한 한 많이 사용하여 다음 데이터 청크로 바꾸십시오 전역 메모리. 물론 레지스터 압력을 증가 시키면 워프 점유가 줄어들지 만 빠른 온칩 레지스터를 사용하여 오프 칩 메모리 대기 시간을 감추고 있습니다. 스레드 레지스터 사용량을 늘리는 방법은 루프를 풀거나 ILP를 늘리거나 스레드 당 더 많은 출력 데이터를 계산하는 것입니다.이 방법은 기본적으로 더 많은 입력에 대해 동일한 작업을 수행하여 ILP를 증가시킵니다. 이 접근법은 Volkov (Lower Occupancy에서 더 나은 성과)에 의해 기본적으로 제안되었습니다.
이제 nvcc 컴파일러 드라이버에는 maxrregcount라는 명령 줄 옵션이있어서 스레드 당 레지스터 사용을 변경할 수 있습니다. 이 옵션을 사용하면 컴파일러가 스레드 당 레지스터 사용량을 줄 이도록 강요 할 수 있지만 강제로 증가시킬 수는 없습니다. 스레드 등록기 사용량을 늘리고 싶지만 루프 경계가 데이터에 따라 다르며 동적이기 때문에 커널 내부에서 루프를 풀어 낼 수없는 경우가 있습니다. 지금까지 몇 가지 트릭을 시도했지만, 스레드 레지스터 사용량을 늘리는 방법에 대한 아이디어가 부족합니다. 누구나 단일 CUDA 스레드의 레지스터 사용을 늘릴 수있는 방법을 제안 할 수 있습니까?
죄송하지만이 질문은 완전히 불합리한 것처럼 보입니다. –
@ 로저 달 (Robert Dahl) : 제가 언급 한 논문을 방금 읽었을 때, 제가 여기에서하려고하는 요점을 이해할 수 있습니다. – nurabha