2012-06-11 4 views
2

공유 메모리에 상수 값을 저장하면 어떤 이점이 있습니까? 예 :공유 메모리 및 상수

A[tid] = CONSTANT * B[tid],

A와 B가 배열되어

, CONSTANT는 상수 값이고, 예를 들어 4. tid는 스레드 인덱스 (배열 요소 = 단일 스레드)입니다.

모든 스레드는 값 CONSTANT을 읽어야하므로 공유 메모리가 유용해야합니다. 맞습니까?

어떻게 생각하십니까 : 전역 메모리에서 읽는 것은 많은 시간을 소비하므로 전역 메모리에서 constatnt 값을 한 번 공유 메모리로 읽은 다음 스레드에서이를 빠르게 읽을 수 있습니다. 많은 스레드가 있기 때문에 (상수 값은 여러 번 읽혀 져야합니다.) 공유 메모리는 속도를 높여야합니다.

답변

4

x86과 같은 일부 CPU 명령어 세트는 opcode 자체와 인터리브 된 피연산자로 전체 크기 상수를 저장하는 것을 지원합니다. 이 경우 상수는 CPU가 실행중인 명령 스트림의 나머지 부분과 함께 분명히 읽혀지며 다른 곳에 저장하는 것이 더 빠를 가능성은 거의 없습니다.

ARM과 같은 다른 아키텍처는 opcode 내에 작은 상수와 시프트 값을 저장하는 것을 지원합니다. 일반적으로 프로그램에 필요한 대부분의 상수는 작은 상수와 시프트 값으로 표현 될 수 있으므로 opcode 내에 직접 저장할 수 있습니다.

SASS (NVIDIA GPU 용 기본 명령어 세트)가 이러한 "내장"상수를 지원하는지 모르겠습니다.

공유 메모리에 상수를 저장하는 경우 해당 상수를 참조해야하며 참조 자체는 상수이거나 상수 (예 : 기본 주소)에서 파생됩니다.

또한 상수로 지정된 값에 대한 캐시가 있습니다. 커널을 호출하기 전에 상수 메모리에 값을 설정하여이 캐시를 이용할 수 있습니다.

또한 공유 메모리에서 상수를 설정하는 오버 헤드를 고려하십시오. 공유 메모리의 값은 블록의 스레드 내에서만 공유 할 수 있으므로 각 블록은 상수를 다시 설정해야합니다. 쓰레드는 32 개의 그룹 (워프)에서 실행되기 때문에, 커널은 새로운 블록에서 처리가 시작될 때마다 상수 설정시 32 개의 스레드를 연결합니다.

결론적으로 컴파일러에서 예제와 같은 단일 상수를 처리하고 상수 메모리를 사용하여 상수 배열을 저장하는 것이 가장 좋습니다.

+4

다양한 GPU 명령어 세트는 정수 및 부동 소수점 명령어 모두에 대해 일부 명령어에서 인코딩되는 즉시 값을 제공합니다. 컴파일러는 가능한 경우 컴파일 타임 상수에이 기능을 사용합니다. 상수를 명령어에 임베드 할 수없는 경우 컴파일러는이를 상수 뱅크 중 하나에 배치 할 수 있으며이 데이터는 상수 캐시에 의해 캐시 될 수 있습니다. 상수 캐시에는 동일한 상수를 사용하여 워프의 모든 trhead를 동시에 제공하는 브로드 캐스트 기능이 있습니다 . 따라서 개별 상수의 경우 컴파일러에만 의존 할 수 있습니다. – njuffa

1

상수 메모리 공간이 캐싱되고 읽기 성능이 우수합니다. 따라서 공유 메모리에 성능 차이가 많이 저장 될지는 의문입니다.