2013-07-17 2 views
0

저는 CUDA를 처음 접했고 코드 실행 속도를 높이기 위해 커널 시작 조건을 최적화하는 방법에 대해 자세히 알고 싶습니다. 이것은 매우 특정한 시나리오이지만 가능한 한 많이 일반화하려고 노력할 것이므로 비슷한 질문을 가진 다른 누구도 향후이 문제로부터 얻을 수 있습니다.CUDA 최적화 - 커널 시작 조건

입력으로 커널에 전송되는 300 개의 요소 (배열 A)의 배열이 있다고 가정합니다. 이 배열은 몇 가지 반복 정수로 구성되며 각 정수는 해당 정수와 관련된 장치 기능을 갖습니다. 예를 들어, Array A에 5가 나타날 때마다 커널은 5에 해당하는 기능을 수행합니다.이 기능은 장치 기능입니다.

이 문제를 병렬화하는 방법은 각 블록이 해당 요소와 관련된 병렬 기능을 수행 할 수 있도록 320 블록 (아마도 가장 좋은 번호는 아님)을 실행하는 것입니다.

CPU는 전체 요소를 요소별로 처리하고 각 함수를 차례로 호출하는 반면 GPU는 각 블록에 요소를 할당하므로 모든 320 블록이 관련 장치에 액세스 할 수 있습니다 함수를 동시에 계산할 수 있습니다.

많은 수의 요소에 대해 이론적으로는 GPU가 더 빨라야합니다. 적어도 제 생각에는 그렇지만 제 경우에는 그렇지 않습니다. 내 생각에 300 개 요소가 작은 수이기 때문에 CPU는 항상 GPU보다 빠를 것입니다.

이것은 받아 들일 수 있습니다. 그러나 내가 알고 싶은 것은 GPU 실행 시간을 최소한 조금 줄이는 방법입니다. 현재 CPU는 2.5 밀리 초, GPU는 12 밀리 초 정도 걸립니다.

질문 1 - 처음 시작할 때 최적의 블록/스레드 수를 어떻게 선택할 수 있습니까? 먼저 블록 당 1 개의 스레드로 320 개의 블록을 시도했습니다. 그런 다음 320 개의 스레드로 1 블록. 실행 시간에 실제 변화가 없습니다. 블록/스레드 수를 조정하면 속도가 향상됩니까?

질문 2 - 300 개 요소가 너무 작 으면 그 이유는 무엇이며 대략 GPU가 CPU를 능가하는 것으로보아야하는 요소는 대략 몇 개입니까?

질문 3 - 어떤 최적화 기술을 조사해야합니까?

이 내용이 분명하지 않은 경우 알려 주시면 자세히 설명 드리겠습니다.

미리 감사드립니다.

+0

가능한 [CUDA 그리드, 블록, 스레드 크기]의 복제본 (http : // stackoverflow.com/questions/9985912/cuda-grid-block-thread-size) – talonmies

+0

@talonmies 내 하드웨어의 엄격한 한계 내에서 작업해온 링크를 보내 주셔서 감사합니다. 내가 이해하는 바로는 블록/스레드 번호에 대한 간단한 대답은 없으며 시행 착오 일 뿐이다. 모든 입력 요소를 상수 메모리에 저장하여 액세스 시간이 빨라야합니다. 내가 알아봐야 할 초보자를위한 다른 기본적인 최적화 기술? – user2550888

+0

이것은 대단히 발산적인 작업처럼 들립니다. 예 : 동일한 워프에서 다른 숫자를 얻는다면 워프는 본질적으로 숫자를 순차적으로 처리해야합니다. 이것은 성능에 실제로 부정적인 영향을 미칩니다. 내가 고려할 한 가지는 특정 작업 (예 : 스레드 0-warpSize는 5로 처리 요소 전용)에 전용 된 워프 (또는 커널)를 가지고 있으며이 스레드에 작업을 할당하는 체계를 고안하려고합니다. – Eugene

답변

1
  1. 내부적으로 CUDA는 32 개 그룹의 스레드 (소위 워프)를 관리합니다. 블록 장치 당 스레드가 1 개인 경우 32 개가 여전히 실행됩니다. 31 개의 스레드는 단순히 발산 상태가됩니다. 장치 및 문제 크기로 관찰 할 수는 없지만 점유 가능성 문제 일 수 있습니다. 또한 다중 프로세서 (SM)가 실행할 수있는 블록 수에 제한이 있습니다. AFAIR, GeForce 4x는 하나의 SM에서 최대 8 개의 블록을 실행할 수 있습니다. 따라서 8 개의 SM이있는 장치를 사용하는 경우 블록 크기가 1이면 64 개의 스레드를 동시에 실행할 수 있습니다. 더 나은 블록 크기를 계산하려면 점유 계산기라고하는 도구를 사용하거나 시각적 프로파일 러를 사용할 수 있습니다.
  2. 프로파일 링을 통해서만 결정할 수 있습니다. 너무 많은 알 수없는 항목이 있습니다 (예 : 실제 계산에 대한 메모리 접근 비율, 작업이 병렬화되는 방식 등은 무엇입니까?
  3. best practices guide으로 시작하는 것이 좋습니다.