2011-10-12 9 views
1

OpenCL에서 모든 스레드는 몇 가지 공통 값을 계산해야합니다. 다음 중 두 가지 경우가 더 빠릅니다. 1. 모든 스레드가 값을 계산하고 개인 메모리에 저장하며 스레드간에 동기화가 필요하지 않습니다. 2. 하나의 스레드가 계산하여 로컬 메모리에 저장합니다. 장벽으로 동기화되었습니다. 작업 그룹의 모든 스레드는 로컬 메모리의 값에 액세스합니다.OpenCL - 성능에 장벽이 미치는 영향

감사합니다.

답변

2

OpenCL을 실행하는 장치의 범위 (예 : 다양한 GPU, 다양한 CPU 및 셀 BE)에서 정답이 있습니까? 성능 특성은 CPU와 GPU, 그리고 GPU 공급 업체와 모델간에 크게 다를 수 있습니다.

귀하 또는 귀하의 사용자가 관심있어하는 플랫폼 및 구현에 대해 측정해야합니다.

호스트의 몇 가지 일반적인 값을 미리 계산하여 OpenCL 커널에 동적 매개 변수로 전달하거나 OpenCL 커널에 대한 컴파일 시간 매개 변수로 전달할 수 있습니까?

2

이러한 공통 값을 계산하는 복잡성과 병렬로 실행할 수있는 작업 항목 수에 따라 다릅니다.

공통 값을 계산하는 시간을 A, 나머지 계산을 수행 할 시간을 B, 장벽의 오버 헤드를 AO & BO (파트 및 B 파트)라고합니다. 각 옵션의 시간을 계산할 수 있습니다.

  • 옵션 1과 단일 스레드 1000 개 작업 항목 : 1000A + 1000B
  • 옵션 2와 단일 스레드 1000 개 작업 항목 : A + AO + 1000B + 1000 개 스레드 1000BO
  • 옵션 1 1000 작업 항목 : 1000 개 스레드 1000 개 작업 항목에 A + B
  • 옵션 2 : A는 + AO는 옵션이 분명히 느린 B + BO 작업 항목 많은 스레드를 가지고

입니다 + . 단일 스레드가있을 때 BO가 A에 비해 작 으면 옵션 2가 빠를 것입니다.

진실은 아마도 어딘가에있을 것입니다.

옵션 3은 호스트가이 값을 계산하고 결과를 상수 메모리에 저장하게합니다. 이 작업을 수행하고 약간의 이중 버퍼링을 사용하면 OpenCL이 현재 계산을 수행하기를 기다리는 동안 다음 공통 값을 계산할 시간을 숨길 수 있습니다.

+0

실제로 모든 스레드가 병렬로 실행할 수 있다는 보장이 없으므로 실제로 간단하지 않습니다. 따라서 1000 스레드의 경우 옵션 1의 경우 n * A + n * B와 같을 수 있고 A + n * 옵션 2의 경우 AO + n * B + n * BO입니다. 그리고 단일 스레드 예제가 어떤 의미인지 이해할 수 없습니다. 왜 그 스레드는 A와 1000 년에 A를 재 계산했을까요? – Grizzly

+0

또한 아키텍처에 따라 A가 정확히 계산되는 방법에 따라 리소스 충돌이 발생하여 여러 스레드가 병렬로 수행하려고 할 때 A의 계산 속도가 느려질 수 있습니다 (예 : 모두 동일한 메모리에 액세스하려고하기 때문에 아키텍처에서 브로드 캐스트 처리) m> = 1 인 옵션 1에 대해 m * n * A + n * B로 만듭니다. 그래서 결국 아키텍처, 스레드의 양과 계산 비용의 부담없이 어떤 대답도 줄 수는 없습니다. A와 장벽의 비용 – Grizzly

관련 문제