저는 OpenCL을 처음 접했고 작업 그룹과 작업 항목을 더 잘 이해하려고 노력하고 있습니다. 단일 그룹 내의 모든 스레드 (항목)가 메모리, 원자 적 연산 및 장벽 동기화를 공유한다는 것을 알고 있습니다. 나는 이러한 혜택을 필요로 만 주어진 스레드?의 글로벌 ID 신경 쓰지 않으면 내가 얼마나 많은 그룹과 얼마나 많은 항목을 선택 가야 그렇다면OpenCL : 스레드 글로벌 ID 만 신경 쓰면 이상적인 블록 수?
그러나 무엇
get_global_id(0)
각 그룹해야 내가 신경 쓰는 것이 총 스레드 수라면? (그룹당 그룹 = 항목)
예를 들어 400x400 행렬을 계산하는 프로그램이 있다고 가정 해 보겠습니다. 총 160,000 개의 스레드가 있습니다. 원래 나는 (순진하게) 한 블럭 안에 모든 것들을 고집하려고했지만 블럭 당 허용되는 한도를 넘는 것이라고 생각했습니다. 그래서 임의의 블록 수를 선택합니다 : 1600 블록 당 100 개의 스레드. 평균적으로 내 speedup은 CPU 싱글 스레드의 x5.5였습니다 (아직 내 코드를 실행하기에 좋은 GPU가 없습니다 ...). 그래서 블록을 사용할 필요가 없으므로 생각했습니다. 모든 단일 스레드에 자체 블록을 제공하지 않는 이유는 무엇입니까? 내 속도 향상은 평균 4.5 배였습니다. 따라서 각 스레드에게 자체 블록을 제공하는 것이 더 느립니다.
여기 정확히 어떻게되는지, 블록을 만드는 데 약간의 오버 헤드가 있다고 생각합니까? 내가 가지고 있어야하는 최적의 블록 양을 계산하려면 어떻게해야합니까? 가능한 한 적은 블록을 만들기 위해 최적의 솔루션이 있습니까?
코드를 공유해주세요. 그것은 행렬 덧셈 또는 곱셈 또는 다른 것입니까? 행렬 수준의 병렬 처리가 어쩌면 수행 될 수 있도록 각 그룹에 대해 다른 행렬을 처리하도록 코드를 변경할 수 있습니까? –