2012-06-21 4 views
0

OpenCL에 익숙하지 않은 경우 다음 시나리오가 가능한지 알고 싶습니다.OpenCL - 메인 커널 채움 버퍼 및 서브 커널에서 실행

메모리에는 길이가 10000 인 10 개의 버퍼 또는 캐시로 작동하는 10xN 이미지 버퍼가 만들어집니다.

첫 번째 커널은 캐시에서 한 행을 채우고 다른 커널에 해당 행에 대한 작업을 수행합니다. 두 번째 커널이 완료되면 첫 번째 커널은 새 행을 계산하고 이전 행을 대체 할 수 있으며 첫 번째 커널에 더 이상 작업이 없을 때까지 동일한 절차가 계속됩니다.

GPU 프로그래밍에서는 장면이 의미가 있으며 그것이 가능합니까?

답변

1

OpenCL은 커널이 다른 커널을 호출하는 것을 허용하지 않습니다. 하지만 몇 가지 옵션이 있습니다.

  1. 첫 번째 커널이 커널 이외의 다른 기능을 호출하게하십시오. 작업 항목 간의 작업 분산은 여기에서 변경되지 않습니다. 따라서 10 개의 병렬 작업 항목 (스레드)이 실행될 때 각 행에 하나씩 있으면 각 스레드가 비 커널 기능의 동일한 데이터에서 작동합니다.

  2. 여러 커널을 차례로 enequeue 할 수 있지만 호스트에 의해 조정됩니다. 이 스레드 간의 작업 재배포를 허용 않지만, 일반적으로 더 나은 빠른 오픈 CL 코드를 만드는 열쇠 1.

하나는 작업 항목에 작업을 분할되는 옵션보다 할 더 복잡 할 수 있습니다. 행을 채우는 첫 번째 커널을 10 개의 작업 항목으로 만 나눌 수 있지만이 행에서 처리하는 두 번째 커널을 1000 개의 작업 항목으로 나눌 수 있다면 두 번째 부분으로 옵션 2를 사용할 수 있습니다. 최신 GPU와 같은 많은 수의 코어를 가진 장치에서보다 효율적으로 분리 될 수 있습니다. 작은 수의 작업 항목 (예 : 10)은이 사용 가능한 처리 능력의 일부만을 사용할 수 있습니다.

(추가) GPU에서 실행

오픈 CL 커널을 동시에 실행할 수있는 하나의 커널을 의미 데이터 평행하지만 각 스레드는 데이터의 다른 부분과 함께 작동한다. 이 모델에 맞게 알고리즘을 다시 생각해 볼 가치가 있습니다.

메모에 작성한 내용으로 인해 메모리 제약으로 인해 한 번에 10 개의 항목을 실행하는 것처럼 들립니다. 그러나 OpenCL에는 동적 메모리 할당이 없다는 점에 유의하십시오. 모든 버퍼가 앞에 선언됩니다. 따라서 호스트는 사용 가능한 메모리에 얼마나 많은 작업을 넣을 수 있는지 결정해야하며 적절한 버퍼 전송으로 작업 항목의 일괄 처리를 실행해야합니다.

어떻게 버퍼를 채우고 있습니까? 파일 에서요? OpenCL 커널은 파일, 네트워크 등을 읽을 수 없으므로 원본 데이터를로드하는 방법 인 경우 호스트에서이 작업을 수행해야합니다. 그러나 이러한 이미지 버퍼가 다른 소스 (예 : 알고리즘 또는 다른 메모리 내 소스)에서 생성 된 경우에는 정상적으로 작동합니다 (다른 인 메모리 소스도 GPU에 복사해야 함) .

+0

저의 경우입니다. 작업 항목의 비율은 위에서 설명한 첫 번째 및 두 번째 작업에 대해 1 : 2000입니다. 그래서 옵션 2는 내 질문에 대한 답입니다. 두 번째 작업에 대한 데이터를 유지하기 위해 버퍼가 필요하기 때문에 필자는 예제에서 10 개의 행을 언급했으며 방금 모든 작업을 시작하면 메모리 요구량이 커질 것입니다. 따라서 첫 번째 커널에 N 개의 작업이있는 경우 두 번째 작업이 완료 될 때마다 동시에 10 개의 작업 항목 만 실행하고 새 작업 항목 만 계속 진행할 수 있습니까? –

+0

또한 호스트의 첫 번째 작업을 유지하고 gpu에 입력 데이터를 쓰고 두 번째 작업을 대기열에 넣고 완료하면 결과를 읽고 gpu에 새로운 입력 집합을 작성하고 다시 대기열에 넣을 생각입니다. 하지만 첫 번째 작업도 GPU에서 만들 수 있다면 나는 호스트에서 GPP로 그렇게 많이 쓰지 않아도됩니다. –

+0

@ s093294 다른 GPU 하드웨어는 다른 성능을가집니다. 호스트에서 첫 번째 작업을 유지하는 것은 호스트에서 장치로 메모리를 복사하는 데 걸리는 시간 (복사해야 할 장치, 호스트 및 메모리 크기에 따라 다름)에 따라 빨라질 수 있습니다. 두 가지를 모두 시도해보고 하드웨어로 가장 빨리 끝나는 것을 선택하는 것이 좋습니다. – prunge