나는 수학 함수 세트를 설계하고 CPU와 GPU (CUDA 포함) 버전 모두에서이를 구현하고 있습니다.룩업 테이블 용 CUDA 메모리
이러한 기능 중 일부는 조회 테이블을 기반으로합니다. 대부분의 테이블은 4KB를 사용하며, 그 중 일부는 조금 더 많습니다. 룩업 테이블에 기초한 함수는 입력을 취하고, 룩업 테이블의 하나 또는 두 개의 엔트리를 선택한 다음, 보간법 또는 유사한 기법을 적용하여 결과를 계산한다.
내 질문이 있습니다.이 룩업 테이블을 어디에 저장해야합니까? CUDA 장치는 값 (전역 메모리, 상수 메모리, 텍스처 메모리 등)을 저장하기위한 많은 장소를 가지고 있습니다. 모든 테이블을 여러 스레드가 동시에 읽을 수 있고 입력 값 및 조회 색인이 모든 워프의 스레드간에 완전히 상관되지 않아 (비 상관 메모리 액세스가 발생 함), 가장 빠른 액세스를 제공하는 메모리가 있습니까?
이 표의 내용은 미리 계산되고 완전히 상수로 추가됩니다.
편집 그냥 명확하게 : 나는 약 10 가지가 4KB 룩업 테이블을 저장해야합니다. 어쨌든이 경우에 대한 해결 방법이 무엇인지 아는 것은 좋을 것입니다. 예 : 4KB 테이블 100 개 16 개의 16KB 룩업 테이블.
상수 캐시는 브로드 캐스트의 경우를 대상으로합니다. 즉, 워프를 통한 액세스는 일정합니다. 워프의 모든 스레드가 다른 위치에 액세스하지만 성능이 저하되면 작동합니다. 공유 메모리는 빠르며 48KB이기 때문에 적합합니다. 그러나 다른 용도로 사용해야 할 수도 있고 코드가 제대로 작동하지 않는 라이브러리의 일부분 일 수도 있습니다. 공유 메모리를 사용할 수 없다면 텍스처를 제안 할 것입니다. FLOPS가 GPU 세대 전체의 메모리 대역폭보다 빠르게 증가하고 있으므로 GPU의 테이블을 전혀 사용하지 않는 것이 가장 좋습니다 (CUDA 수학 라이브러리 참조). – njuffa
감사합니다, njuffa, 명확한 설명. 내 유일한 질문은 공유 메모리에 관한 것입니다. 내가 정확하게 기억한다면,이 메모리는 같은 날실에서 쓰레드들간에 공유된다. 그럼, 모든 워프에 테이블을 복제해야합니까? 그리고 커널의 종료 후에 테이블이 지속될 것인가? – Spiros
공유 메모리는 스레드 블록의 모든 스레드간에 공유됩니다. 그래서 나는 총 40KB의 테이블 스토리지가 당신의 코드가 SM 당 하나의 쓰레드 블록으로 제한 될 것을 두려워합니다.대부분의 경우 두 개 이상의 스레드 블록을 실행하는 것이 더 좋으므로 일부 테이블이 공유 메모리 (가장 많은 액세스가있는 테이블)와 다른 테이블이 텍스처 메모리에 저장되는 혼합 스키마를 사용하는 것이 좋습니다. 텍스처 메모리는 또한 무료 (저 정확도) 선형 보간을 얻을 수 있다는 이점이 있습니다. 큰 테이블이 필요한 어떤 수학 함수를 구현하고 있습니까? – njuffa