각 스레드에 대해 CUDA 커널 함수에서 로컬 변수를 선언한다고 가정 해 보겠습니다.로컬 메모리 액세스가 병합됩니까?
float f = ...; // some calculations here
선언 된 변수가 컴파일러에 의해 로컬 메모리 (전역 메모리와 동일합니다 내가 아는 한 한 스레드에서만 볼 수 있습니다). 내 질문은 그것을 읽을 때 f
에 대한 액세스가 병합됩니까?
각 스레드에 대해 CUDA 커널 함수에서 로컬 변수를 선언한다고 가정 해 보겠습니다.로컬 메모리 액세스가 병합됩니까?
float f = ...; // some calculations here
선언 된 변수가 컴파일러에 의해 로컬 메모리 (전역 메모리와 동일합니다 내가 아는 한 한 스레드에서만 볼 수 있습니다). 내 질문은 그것을 읽을 때 f
에 대한 액세스가 병합됩니까?
로컬 메모리 (또는 Fermi의 스택)가 메모리에 배치되는 방법에 대한 공식적인 문서가 없다고 생각하지만, mulitprocessor 할당이 "줄무늬"방식으로 액세스되어 비 발산 동일한 워프의 쓰레드는 로컬 메모리에 대한 통합 된 액세스를 얻습니다. Fermi에서 로컬 메모리는 전역 메모리와 동일한 L1/L2 액세스 메커니즘을 사용하여 캐시됩니다.
CUDA 카드에는 로컬 변수에 할당 된 메모리가 없습니다. 모든 지역 변수는 레지스터에 저장됩니다. 변수가 많은 복잡한 커널은 병행 적으로 실행할 수있는 스레드 수를 줄여 주며, 낮은 점유율이라고합니다.
간단히 말해서 사실이 아닙니다. 모든 스레드는 최대 16kb의 정적으로 할당 된 로컬 메모리 할당을 가질 수 있습니다. 이 메모리는 칩 밖에서 SDRAM에 저장되며 캐시되지 않습니다. 자세한 내용은 [this] (http://drdobbs.com/high-performance-computing/215900921) 또는 CUDA 프로그래밍 가이드를 참조하십시오. – talonmies
당신은 아주 옳습니다. 나는 여러 번 프로그래밍 가이드를 살펴본 적이 있고 어떻게 든 이전에는 알아 채지 못했습니다. –