Compute Capability 2.0 (Fermi)이 출시 된 후 공유 메모리에 남은 유스 케이스가 있는지 궁금해했습니다. 즉, L1이 백그라운드에서 마술을 수행하도록하는 것보다 공유 메모리를 사용하는 것이 더 나은 이유는 무엇입니까?CUDA : 공유 메모리를 언제 사용하고 언제 L1 캐싱을 사용해야합니까?
간단히 공유 메모리가있어 수정하지 않고 효율적으로 CC < 2.0을 실행하도록 설계된 알고리즘을 허용합니까?
공유 메모리를 통해 공동 작업하려면 블록의 스레드가 공유 메모리에 쓰고 __syncthreads()
과 동기화하십시오. 단순히 전역 메모리 (L1을 통해)에 쓰기 만하고 __threadfence_block()
과 동기화해야하는 이유는 무엇입니까? 후자의 옵션은 두 개의 서로 다른 값 위치와 관련이 없으므로 구현이 더 쉬워야하며 전역 메모리에서 공유 메모리로의 명시적인 복사가 없기 때문에 더 빨라야합니다. 데이터가 L1에서 캐시되기 때문에 스레드는 데이터를 전역 메모리에 실제로 전달할 때까지 기다릴 필요가 없습니다.
공유 메모리를 사용하면 블록 기간 동안 거기에 저장된 값이 그대로 유지됩니다. 이것은 L1에서 값과 반대되는데, 이는 충분히 자주 사용하지 않으면 축출됩니다. 알고리즘이 실제 사용하는 패턴을 기반으로 L1이 공유 메모리를 관리하도록하는 것보다 공유 메모리에서 데이터가 거의 사용되지 않는 캐시가 더 나은 경우가 있습니까?
고맙습니다. 제 질문에 답변 해 주셔서 감사합니다. 나는 캐시가 어떤 요소가 가장 많이 사용되었는지를 추적 할 수 있다고 묘사했고, 캐시를 선호한다. 지금은 n-way 연관 캐시를 읽었으며 주요 문제가 다른 캐시 라인이 해당 슬롯에 들어가기 때문에 자주 사용되는 값을 버릴 수 있다고 생각합니다. –
CUDA 프로그램을 작성하기위한 좋은 전략은 처음에는 전역 메모리 만 사용하고 L1이 메모리 대기 시간이 숨겨져 있는지 충분히 잘 작동하는지 확인하는 알고리즘을 작성하는 것입니다. 그리고 알고리즘이 메모리 바운드 인 것으로 판명되면 공유 메모리로 손을 최적화하는 것을 고려하십시오. –