병합되지 않은 메모리 액세스를 병합 된 것으로 변환하는 간단한 방법이 있는지 궁금합니다. 의이 배열의 예를 보자 :병합되지 않은 액세스에서 병합 된 메모리 액세스 CUDA
dW[[w0,w1,w2][w3,w4,w5][w6,w7][w8,w9]]
지금, 나는 블록 0 액세스의 스레드 0 dW[0]
다음 블록 0 액세스 dw[1]
1 스레드 경우, 즉 글로벌 메모리에 합체 액세스 있다는 것을 알고있다. 문제는 두 가지 작업이 있다는 것입니다. 첫 번째 것은 위에서 설명한대로 병합됩니다. 그러나 두 번째 것은 블록 0의 스레드 1이 dW[0]
, dW[1]
및 dW[2]
모두에서 연산을 수행해야하기 때문이 아닙니다.
컨테이너의 초기 모양이 병합 액세스를 허용하거나 금지한다는 것을 알고 있습니다. 그러나 dW
은 매우 큰 배열이며 프로세스 중에 변환 할 수 없습니다.
이 문제를 해결할 수 있는지 알고 계십니까?
(1) 벤치 마크 결과 벤치 마크 결과 미숙 한 메모리 액세스가 속도 저하의 중요한 원인이라고 알려 주셨습니까? (2) 아무도 메모리 액세스 패턴을 실제로 보여주는 [mcve]를 게시하지 않는 한 메모리 액세스를 최적화하는 데 도움을 줄 수 없습니다. –
그래, 두 가지 벤치 마크를 수행했습니다. 그리고 그들은 경기 침체를 확인했습니다 (그리 많지는 않지만 천천히 ...). 이러한 작업은 복잡한 프로그램의 일부이기 때문에 항상 간단한 코드를 표시하는 것은 여전히 어렵습니다. 나는 똑같은 문제를 일으키는 것을 구현하려고 노력할 것이다. –