2013-06-13 2 views
7

나는 수학 함수 세트를 설계하고 CPU와 GPU (CUDA 포함) 버전 모두에서이를 구현하고 있습니다.룩업 테이블 용 CUDA 메모리

이러한 기능 중 일부는 조회 테이블을 기반으로합니다. 대부분의 테이블은 4KB를 사용하며, 그 중 일부는 조금 더 많습니다. 룩업 테이블에 기초한 함수는 입력을 취하고, 룩업 테이블의 하나 또는 두 개의 엔트리를 선택한 다음, 보간법 또는 유사한 기법을 적용하여 결과를 계산한다.

내 질문이 있습니다.이 룩업 테이블을 어디에 저장해야합니까? CUDA 장치는 값 (전역 메모리, 상수 메모리, 텍스처 메모리 등)을 저장하기위한 많은 장소를 가지고 있습니다. 모든 테이블을 여러 스레드가 동시에 읽을 수 있고 입력 값 및 조회 색인이 모든 워프의 스레드간에 완전히 상관되지 않아 (비 상관 메모리 액세스가 발생 함), 가장 빠른 액세스를 제공하는 메모리가 있습니까?

이 표의 내용은 미리 계산되고 완전히 상수로 추가됩니다.

편집 그냥 명확하게 : 나는 약 10 가지가 4KB 룩업 테이블을 저장해야합니다. 어쨌든이 경우에 대한 해결 방법이 무엇인지 아는 것은 좋을 것입니다. 예 : 4KB 테이블 100 개 16 개의 16KB 룩업 테이블.

+4

상수 캐시는 브로드 캐스트의 경우를 대상으로합니다. 즉, 워프를 통한 액세스는 일정합니다. 워프의 모든 스레드가 다른 위치에 액세스하지만 성능이 저하되면 작동합니다. 공유 메모리는 빠르며 48KB이기 때문에 적합합니다. 그러나 다른 용도로 사용해야 할 수도 있고 코드가 제대로 작동하지 않는 라이브러리의 일부분 일 수도 있습니다. 공유 메모리를 사용할 수 없다면 텍스처를 제안 할 것입니다. FLOPS가 GPU 세대 전체의 메모리 대역폭보다 빠르게 증가하고 있으므로 GPU의 테이블을 전혀 사용하지 않는 것이 가장 좋습니다 (CUDA 수학 라이브러리 참조). – njuffa

+0

감사합니다, njuffa, 명확한 설명. 내 유일한 질문은 공유 메모리에 관한 것입니다. 내가 정확하게 기억한다면,이 메모리는 같은 날실에서 쓰레드들간에 공유된다. 그럼, 모든 워프에 테이블을 복제해야합니까? 그리고 커널의 종료 후에 테이블이 지속될 것인가? – Spiros

+2

공유 메모리는 스레드 블록의 모든 스레드간에 공유됩니다. 그래서 나는 총 40KB의 테이블 스토리지가 당신의 코드가 SM 당 하나의 쓰레드 블록으로 제한 될 것을 두려워합니다.대부분의 경우 두 개 이상의 스레드 블록을 실행하는 것이 더 좋으므로 일부 테이블이 공유 메모리 (가장 많은 액세스가있는 테이블)와 다른 테이블이 텍스처 메모리에 저장되는 혼합 스키마를 사용하는 것이 좋습니다. 텍스처 메모리는 또한 무료 (저 정확도) 선형 보간을 얻을 수 있다는 이점이 있습니다. 큰 테이블이 필요한 어떤 수학 함수를 구현하고 있습니까? – njuffa

답변

2

텍스처 메모리 (현재는 읽기 전용 데이터 캐시라고 함)는 보간 이점이 아닐지라도 탐험 할 가치가있는 선택 일 것입니다. 이 양을 넘어서 읽지 않고 32 비트 읽기를 지원합니다. 그러나 총 48K로 제한됩니다. Kepler (3.x 컴퓨팅)의 경우 지금 프로그래밍하기가 매우 쉽습니다.

전역 메모리는 32 비트 모드로 구성하지 않는 한 각 스레드마다 128 바이트로 드래그되는 경우가 많으므로 메모리 액세스를 병합 할 수 없기 때문에 실제로 필요한 메모리가 실제로 필요한 메모리가 무엇인지를 크게 늘릴 수 있습니다. 따라서 32 비트 모드는 48K (40K 언급) 이상을 사용하려는 경우 필요할 수 있습니다.

이러한 테이블에서 일련의 값 집합에 액세스하려는 경우 병합을 고려하면 이러한 조합을 그룹화하여 스레드 당 64 비트 또는 128 비트 읽기로 읽을 수 있도록 테이블을 인터리브 할 수 있습니다. 이것은 전역 메모리로부터의 128 바이트 읽기가 유용 할 수 있음을 의미합니다.

문제는 룩업 테이블을 사용하여 솔루션 메모리 대역폭을 제한한다는 것입니다. L1 캐시 크기 (Fermi/compute 2.x)를 48K로 변경하면 특히 다른 32K 공유 메모리를 사용하지 않는 경우 상당한 차이가 발생할 수 있습니다. 텍스처 메모리를 시도한 다음 32 비트 모드에서 전역 메모리를 시도하고 알고리즘에 가장 적합한 것이 무엇인지 확인하십시오. 마지막으로 하드웨어를 선택할 수있는 경우 메모리 대역폭이 좋은 카드를 선택하십시오.