2012-06-12 3 views
2

먼저 CUDA를 사용하는 응용 프로그램을 설명해야합니다.GPU에서 메모리 액세스 속도를 높이려면 어떻게해야합니까? (CUDA)

이것은 표준 열 흐름 시뮬레이션입니다. 나는 float (변형 가능한 온도와 열, 상수 k 값, sar_value 및 기타 몇 가지)의 3D 배열을 가져 와서 GPU에 할당 된 선형 배열로 복사합니다. 이들 모두는 전역 메모리에 있습니다.

다음으로 열 흐름을 계산하는 커널 함수를 시작합니다. 이 커널을 2 차원 블록 구조와 1D 스레드 구조로 시작합니다. 블록은 열 흐름 계산을 수행하는 시뮬레이션 큐브의 x 및 y 좌표에 해당합니다. 스레드는 z 좌표에 해당합니다. 모든 스레드/블록 좌표는 성능을 극대화하기 위해 전체 큐브 크기의 배수입니다.

다음으로 각 셀에 대해 긴 계산을 수행합니다. 모든 배열은 선형이므로 z, y 및 x 방향으로 다음 셀을 계산하기 위해 오프셋을 미리 준비했습니다. 공간 지역성의 대부분은 쓰기/읽기 메모리에서 발생하므로 텍스처 메모리는 옵션이 아닙니다. 총 계산에서 큰 배열에 2 개의 쓰기, 6 개의 상수 큰 배열 읽기 (300 MB 배열의 부동 소수점), 8 개의 큰 배열 읽기, 6 개의 작은 정수 배열 읽기 (300의 큐브 루트와 같이) MB). 이 모든 것은 두 줄의 코드에서 발생합니다. 필자는 캐시 된 것으로 가정하므로 별도의 읽기와 동일한 메모리 위치에 대해 여러 번 읽지 않았습니다.

두 번째로 나는이 계산으로 얻은 결과에 대해 설명 할 것입니다.

나는 테슬라 C1060에서 약 2 억 2500 만 개의 세포를 얻는다. 대용량 데이터 세트 (40 ~ 60 백만 셀)에서 셀 당 스레드 1 개를 실행하는 것과 셀 4 개당 스레드 1 개를 처리하는 것 사이의 성능 차이는 없습니다. 이것은 나에게 계산의 제한 요소가 실제 메모리 페치임을 나타냅니다. 여러 블록에 대해 하나의 스레드를 실행하면 시스템의 메모리 과부하가 없어져서 계산이 덜 빠르지 만 각 계산이 빨라지므로 성능 향상, + 또는 - 백분율로 계산되지 않습니다.

무엇을 시도 했습니까? 3D 공간 메모리에 가장 공간적으로 일정한 대형 배열을 넣으려고했지만 비참한 3-4 배의 속도 저하를 보았습니다. 데이터 액세스 패턴은 대형 배열의 각 인덱스가 한 두 번 액세스되는 것과 같은 것인데도 컴파일 타임에 입력 크기를 반드시 알 필요가 없기 때문에 상수 메모리를 사용할 수 없다고 생각했습니다. 큰 상수 배열에 대해 1D 텍스처를 시도했습니다. 나쁘다.

더 많은 작업이 있습니까? 또한 초 당 바이트 페치 수 (225 백만/초 * 100 바이트 정도)를 볼 수 있다면 테슬라 C1060의 메모리 대역폭은 약 10 배 정도입니다. 왜 메모리가 제한 요소입니까? 어떤 사람이 유사한 열 흐름 계산을 위해 데이터 세트를 "바둑판 식으로 배열"한 것을 보았습니다 ("민트"뒤에있는 사람들이 종이로 생각했습니다). 이것이 의미하는 바는 무엇입니까?

답변 해 주셔서 감사합니다. 의견 섹션에서 질문하십시오.

+1

질문에 대한 진술을 너무 감사드립니다. CUDA 프로파일 러에서 프로그램을 실행 했습니까? Compute Visual Profiler는 프로그램을 분석하고 일련의 권장 사항을 생성합니다. 권장 사항은 무엇입니까? 각 스레드가 다른 셀에 있습니까? 어떤 종류의 메모리 액세스 패턴이 워프에 의해 생성되었는지 확인하려고 시도 했습니까? –

+0

CUDA의 3D 고차 유한 차분 스키마에 대한 [이 문서] (http://developer.download.nvidia.com/CUDA/CUDA_Zone/papers/gpu_3dfd_rev.pdf)를 읽고 [이 슬라이드] (http : //mc.stanford.edu/cgi-bin/images/0/0a/M02_4.pdf) (p 25)? – talonmies

+0

Roger, 아직 CUDA 프로파일 러를 통해 실행하지는 않았지만 제안 할 것입니다. 어떤 쓰레드도 같은 시간 단계에서 같은 셀에 쓰지 않습니다 (나는 당신이 묻고있는 것이라고 생각합니다). 큐브에서 서로 옆에있는 경우 다른 스레드에 의해 배열의 위치가 우연히 읽습니다. 각 워프의 메모리 액세스 패턴은 내가 신경을 쓰지 않은 것입니다. 나는이 대답에서 언급 한 것을들은 후에 지금 할 것이다. 감사. –

답변

3

다음으로 각 셀에 대해 긴 계산을 수행합니다. 모든 배열은 선형이므로 z, y 및 x 방향으로 다음 셀을 계산하기 위해 오프셋을 미리 준비했습니다.

어레이에서 어떤 종류의 액세스 패턴이 사용되고 있는지 신중하게 고려하십시오. 워프의 쓰레드는 "행 - 주요"순서로 연속 된 주소에 액세스해야합니다. 우연히 "열 - 주요"액세스 패턴과 같은 것으로 끝나면 코드가 필요한 것보다 많은 메모리 트랜잭션을 발행하게됩니다.

CUDA 프로그래밍 안내서 4.2의 2.2 절, 스레드 계층 구조는 스레드 색인이 스레드 ID에 매핑되는 방법을 설명합니다. 연속 스레드 ID가 (적어도 크게) 연속 배열 인덱스로 연결되는지 확인하십시오.

관련 문제