2012-02-17 2 views
10

몇 가지 설명이 필요합니다. 저는 작은 노트북 용 GPU (310M)를 운영하는 노트북에서 OpenCL을 개발하고 있습니다. 장치를 CL_DEVICE_MAX_COMPUTE_UNITS에 쿼리하면 결과는 2입니다. 커널을 실행하기위한 작업 그룹 수를 계산 단위 수 (Heterogenous Computing with OpenCL, 9 장, 186 페이지)와 일치시켜야합니다. 그렇지 않으면 너무 많은 전역을 낭비합니다 메모리 bandwitdh.작업 그룹 수에 해당하는 계산 단위 수

또한이 칩에는 16 개의 쿠다 코어가 있다고 명시되어 있습니다 (이는 내가 믿는 PE에 해당합니다). 이론적으로 말하면, 글로벌 메모리 대역폭에 관한이 GPU를위한 가장 효과적인 설정은 각각 16 개의 작업 항목이있는 두 개의 작업 그룹을 갖는 것입니까?

답변

16

작업 그룹 수를 CL_DEVICE_MAX_COMPUTE_UNITS과 동일하게 설정하면 일부 하드웨어에 대한 건전한 조언 일 수 있지만 NVIDIA GPU에서는 이 아닙니다.

CUDA 아키텍처에서 OpenCL 계산 단위는 멀티 프로세서 (8 코어, 32 코어 또는 48 코어를 포함 할 수 있음)와 동일하며 최대 8 개의 작업 그룹 (블록 단위)을 실행할 수 있도록 설계되었습니다. CUDA) . 더 큰 입력 데이터 크기에서는 수천 개의 작업 그룹을 실행하도록 선택할 수 있으며 특정 GPU는 커널 시작 당 최대 65535 x 65535 개의 작업 그룹을 처리 할 수 ​​있습니다.

OpenCL에는 다른 장치 속성 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE이 있습니다. NVIDIA 장치에서이 값을 쿼리하면 32를 반환합니다 (이 값은 "워프"또는 하드웨어의 고유 한 SIMD 너비입니다). 이 값은 사용할 작업 그룹 크기의 배수입니다. 작업 그룹 크기는 각 작업 항목에서 사용하는 리소스에 따라 최대 512 개의 항목이 될 수 있습니다. 특정 GPU의 표준 규칙은 아키텍쳐의 모든 대기 시간을 커버하기 위해 계산 단위 (CUDA 용어로 다중 프로세서 당 스레드) 당 192 개 이상의 활성 작업 항목이 필요하며 잠재적으로 전체 메모리 대역폭 또는 전체 산술 처리량을 얻을 수 있다는 것입니다 코드의 특성에 따라 달라집니다.

NVIDIA는 CUDA 툴킷에서 "OpenCL Programming for the CUDA Architecture"라는 훌륭한 문서를 제공합니다. NVIDIA OpenCL 구현이 하드웨어 기능에 어떻게 매핑되는지에 대한 자세한 내용이 포함되어 있기 때문에 약간의 시간을 들여 읽어야합니다. 여기에서 제기 한 질문에 대한 답변을 얻을 수 있습니다.

+0

감사합니다. – rdoubleui

2

작업 그룹 수를 계산 단위와 일치시키는 것이 CPU에서 좋은 생각이라고 생각하지 않습니다. 여러 번 코어를 초과 구독하는 것이 좋습니다. 이를 통해 다양한 프로세서가 온라인 상태가되거나 다른 작업과 산만하게되어 워크로드가 동적으로 (작업 그룹 퀀텀에서) 이동할 수 있습니다. 작업 그룹 count = CL_DEVICE_MAX_COMPUTE_UNITS은 실제로 아무것도하지 않고 사용하지 않는 코어를 깨우는 데 많은 에너지를 낭비하는 컴퓨터에서만 잘 작동합니다.