CUDA 디바이스에서 전역 메모리 읽기에서 병합하는 것만 큼 전역 메모리 쓰기가 병합되고 있습니까? 그렇다면 어떻게 설명 할 수 있습니까? 또한 초기 세대의 CUDA 장치와이 문제에 관한 가장 최근의 장치 사이에는 차이점이 있습니까?전역 쓰기에서 메모리 병합
답변
통합 읽기 (또는 일치하지 않음)는 병합 읽기 (또는 해당 없음)와 마찬가지로 성능에 영향을 줄 수 있습니다.
int i = my_int_data[threadIdx.x+blockDim.x*blockIdx.x];
단일 하여 만족스러운 본질적으로 모든 개별 스레드를 말하는 메모리 컨트롤러 트랜잭션 (판독 할 수
는 합체 판독 휘어짐 명령에 의해 트리거 판독 트랜잭션, 예를 들어,이 때 발생 . 읽기) 하나의 캐시 라인에서 오는
A는 쓰기 병합하는 것은 발생하면 워프 명령에 의해 트리거 쓰기 트랜잭션 예 :
my_int_data[threadIdx.x+blockDim.x*blockIdx.x] = i;
은 메모리 컨트롤러에서 쓰기 트랜잭션으로 단일 충족 될 수 있습니다.
위의 예에서 나는 세대별로 차이가 없다는 것을 보여 주었다.
그러나 이전 장치가 아닌 이후 장치에서 병합 (즉, 단일 메모리 컨트롤러 트랜잭션으로 축소) 할 수있는 다른 유형의 읽기 또는 쓰기가 있습니다. 위의 예에서
int i = my_int_data[0];
같은 글로벌 위치에서 읽어들이는 모든 스레드 : 하나의 예는 "방송 읽기"입니다. 최신 장치에서는 이러한 읽기가 단일 트랜잭션의 모든 스레드에 "브로드 캐스트"됩니다. 이전의 일부 장치에서는 스레드의 직렬화 된 서비스가 발생합니다. 하나의 위치에 쓰는 다중 스레드는 정의되지 않은 동작을하기 때문에 이러한 예는 아마도 쓰기 작업에서 결과가 없습니다. 그러나 쓰기는 새로운 장치에 병합 할 수 있지만 "스크램블"오래되지 :
my_int_data[(threadIdx.x+5)%32] = i;
위의 모든 쓰기가 (경사 이내) 고유 주 및 개별 캐시 라인에 속하는하지만 그들은 병합을 만족하지 않는 1.0 또는 1.1 장치에 대한 요구 사항이지만 최신 장치에 적용해야합니다.
global memory access description for devices of cc 1.0 and 1.1을 읽고 나중 장치와 비교하면 나중 장치에서 완화 된 이전 장치에서 병합하기위한 요구 사항 중 일부가 표시됩니다.
감사합니다. 쓰기의 경우 캐시가 어떻게 관련되어 있는지 더 자세히 설명해 주시겠습니까? 합체 된 읽기 트랜잭션에서 "모든 개별 스레드 읽기가 단일 캐시 라인에서 이루어집니다."라고 지적했습니다. 따라서 쓰기의 경우 비 합쳐진 쓰기가 여러 개의 L2 캐시 라인을 차지합니다. 맞습니까? – Farzad
예, 비 합체 메모리 트랜잭션은 읽기 또는 쓰기 여부에 관계없이 둘 이상의 캐시 라인에 걸쳐 있습니다. 캐시 캐시는 문제가되지 않습니다. 캐시 라인은 메모리 컨트롤러에 의해 강화 된 상호 교환의 기본 퀀텀입니다. –
내가 수행 한 코스에서이 실험을 수행했습니다. 합병은 적당히 이 읽기보다 쓰기에서 중요하다는 것이 L1과 L2 캐시가 나중에 사용하기 위해 일부 사용하지 않는 데이터를 저장하기 때문에 나타났습니다.
- 1. 메모리 병합 및 트랜잭션
- 2. CUDA에서 전역 메모리 대 동적 전역 메모리 할당
- 3. 전역 메모리 할당
- 4. 전역 임시 테이블과 병합 사용
- 5. 큰 병합/메모리 관리
- 6. CUDA 전역 메모리 트랜잭션의 비용
- 7. 전역 메모리 액세스 방법 정보
- 8. CUDA 스레드로 전역 메모리 복사
- 9. 병합 JSON 객체에 관계없이 메모리
- 10. 메모리 적응 형 병합 알고리즘?
- 11. 병합 정렬의 동적 메모리 할당
- 12. .htaccess 다시 쓰기에서 디렉토리 제외
- 13. 전역 메모리에서 전역 메모리로 쓰기를 올바르게 병합하는 방법은 무엇입니까?
- 14. CUDA : 공유 메모리보다 병합 된 전역 메모리 액세스 속도가 빠릅니까? 또한 대형 공유 메모리 배열을 할당하면 프로그램 속도가 느려 집니까?
- 15. 전역 변수로 인해 메모리 누수가 발생합니까?
- 16. 해시를 사용하여 통합 된 전역 메모리 쓰기
- 17. gcc 전역 데이터 메모리 레이아웃 규칙
- 18. CUDA 동적 병렬 처리 Deferencing 전역 메모리
- 19. 높은 전역 메모리 명령어 오버 헤드 -
- 20. 다중 처리 전역 변수 메모리 복사
- 21. PHP - 전역 변수의 성능 및 메모리 문제
- 22. 불완전한 전역 메모리 액세스가 통합 되었습니까?
- 23. CUDA에서 정적으로 할당 된 전역 메모리 구조체
- 24. 정적 멤버 및 정적 전역 메모리
- 25. 오류 : 병합 정렬 구현 - 메모리 할당
- 26. 거대한 (2GB) XML을 메모리에 병합 (메모리 예외없이)
- 27. 두 SAFEARRAY의 병합 - SafeArrayPutElement 메모리 액세스 위반
- 28. R 첫 번째 행을 쓰기에서 제거, CSV
- 29. 동시 맵 쓰기에서 복구하는 방법은 무엇입니까?
- 30. Nginx 다시 쓰기에서 문자를 대체 하시겠습니까?
합병 문제는 CUDA C 프로그래밍 가이드 (5.3.2 절)와 CUDA C 모범 사례 가이드 (9.2.1 절)에서 광범위하게 논의됩니다. 두 가이드는 다른 아키텍처에 대한 병합 문제도 다룹니다. 자료를 복제하지 않으려면 해당 문서를 살펴보고 애매한 점을 설명하고 설명이 필요한 경우 게시하는 것이 더 건설적입니다. – JackOLantern