2016-09-20 2 views
1

저는 OpenCL을 처음 접했고 작업 그룹과 작업 항목을 더 잘 이해하려고 노력하고 있습니다. 단일 그룹 내의 모든 스레드 (항목)가 메모리, 원자 적 연산 및 장벽 동기화를 공유한다는 것을 알고 있습니다. 나는 이러한 혜택을 필요로 만 주어진 스레드?의 글로벌 ID 신경 쓰지 않으면 내가 얼마나 많은 그룹과 얼마나 많은 항목을 선택 가야 그렇다면OpenCL : 스레드 글로벌 ID 만 신경 쓰면 이상적인 블록 수?

그러나 무엇

get_global_id(0) 

각 그룹해야 내가 신경 쓰는 것이 총 스레드 수라면? (그룹당 그룹 = 항목)

예를 들어 400x400 행렬을 계산하는 프로그램이 있다고 가정 해 보겠습니다. 총 160,000 개의 스레드가 있습니다. 원래 나는 (순진하게) 한 블럭 안에 모든 것들을 고집하려고했지만 블럭 당 허용되는 한도를 넘는 것이라고 생각했습니다. 그래서 임의의 블록 수를 선택합니다 : 1600 블록 당 100 개의 스레드. 평균적으로 내 speedup은 CPU 싱글 스레드의 x5.5였습니다 (아직 내 코드를 실행하기에 좋은 GPU가 없습니다 ...). 그래서 블록을 사용할 필요가 없으므로 생각했습니다. 모든 단일 스레드에 자체 블록을 제공하지 않는 이유는 무엇입니까? 내 속도 향상은 평균 4.5 배였습니다. 따라서 각 스레드에게 자체 블록을 제공하는 것이 더 느립니다.

여기 정확히 어떻게되는지, 블록을 만드는 데 약간의 오버 헤드가 있다고 생각합니까? 내가 가지고 있어야하는 최적의 블록 양을 계산하려면 어떻게해야합니까? 가능한 한 적은 블록을 만들기 위해 최적의 솔루션이 있습니까?

+0

코드를 공유해주세요. 그것은 행렬 덧셈 또는 곱셈 또는 다른 것입니까? 행렬 수준의 병렬 처리가 어쩌면 수행 될 수 있도록 각 그룹에 대해 다른 행렬을 처리하도록 코드를 변경할 수 있습니까? –

답변

2

하나의 옵션은 clEnqueueNDRangeKernel의 에서 local_work_size 매개 변수를 제공하는 것입니다.이 경우 OpenCL 구현은 자체적으로 로컬 크기를 결정합니다. 이것은 최적의 결과는 아니지만, 적어도 OpenCL 구현은 최적의 로컬 크기를 추측하려고합니다.

또한 clGetKernelWorkGroupInfoCL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE을 쿼리하는 데 사용할 수 있습니다.

+0

도움 주셔서 감사합니다 선생님! – danglingPointer