2013-02-12 2 views
6

하나의 시스템에서 두 개의 OpenCL 런타임을 함께 사용하고 싶습니다. (제 경우에는 AMD와 Nvidia이지만 질문은 꽤 일반적입니다).2 OpenCL 런타임 사용 방법

모든 SDK로 프로그램을 컴파일 할 수 있다는 것을 알고 있습니다. 그러나 프로그램을 실행할 때 libOpenCL.so를 제공해야합니다. OpenCL 프로그램에서 3 개의 장치 (AMD CPU, AMD GPU, Nvidia GPU)를 볼 수 있도록 두 런타임의 라이브러리를 어떻게 제공합니까?

나는 그것이 어떻게 든 가능해야한다는 것을 안다. 그러나 나는 리눅스를 위해 그것을하는 방법에 대한 설명을 아직 찾지 못했다.

고마워, 토마스

+0

동일한 기능을 내보내는 두 개의 라이브러리를로드 할 수는 없지만 다른 라이브러리를로드 할 때마다 동일한 앱을 두 번 실행할 수 있습니다. LD_LIBRARY_PATH =/usr/lib64/OpenCL/vendors/intel; ./app_to_run LD_LIBRARY_PATH =/usr/lib64/OpenCL/vendors/amd; ./app_to_run 이것은 원하는 것입니까? – Sacx

+0

멋지다, 그것은 하나의 해결책이 될 것이다. 하지만 정말 한 응용 프로그램에서 사용하고 싶습니다.당신의 솔루션으로 나는 각 런타임마다 2 개의 어플리케이션을 시작한 다음 어떻게 든 하나의 프로그램에서 두 개의 런타임을 모두 사용하도록 어플리케이션을 연결해야합니다 ... 더 쉬운 방법이 정말로 있기를 바랍니다! – Tomas

답변

4

스미스 앤 토마스의 답변이 정확합니다. OpenCL 플랫폼을 열거하면 각 설치된 드라이버마다 하나씩 얻게됩니다. 각 플랫폼 내에서 장치를 열거합니다. AMD 및 인텔 드라이버는 또한 CPU 장치를 노출합니다. 따라서 완전히 설치된 머신에서는 AMD 플랫폼 (CPU 및 GPU 장치 포함), NVIDIA 플랫폼 (GPU 장치 포함) 및 Intel 플랫폼 (CPU 및 GPU 장치 포함)을 볼 수 있습니다. 코드는 사용하려는 장치에 컨텍스트를 작성하고 작동시키는 하나 이상의 명령 대기열을 만듭니다. 모든 작업에 바쁘게 일할 수 있지만 동일한 플랫폼의 장치간에 데이터 버퍼 만 공유 할 수 있습니다. 플랫폼간에 데이터를 공유하려면 그 사이에 CPU 메모리가 있어야합니다.

+0

마지막 문장에서 두 개의 호환 가능한 플랫폼 사이에서 SLI 버스 (사용할 수있는 경우)를 통해 데이터를 전송할 수 있도록 해주는 공급 업체 확장을 상상할 수 있습니다. 그러나 일반적으로 네, 시스템 메모리를 거쳐야합니다. 따라서 문제가 독립적 인 GPU에서 깔끔하게 나뉠 수없는 경우 멀티 GPU 계산이 빨라질 것입니다. – Thomas

5

당신은 그것을 잘 생각하고 있지 않습니다. SDK는 응용 프로그램에서 제공하지 않으며 은 필요하지 않습니다. 컴파일 된 프로그램을 실행하려면이 필요합니다. OpenCL 런타임 클라이언트은 클라이언트 시스템에서 제공하며 이는 사용자의 프로그램 플랫폼 및 장치에 clGetPlatformIDsclGetDeviceIDs에서 사용할 수 있도록 제공합니다.

단순히 그가 엔비디아의 OpenCL 런타임 또는 하드웨어를 가지고 있지 않기 때문에, 자신의 시스템에 엔비디아 플랫폼과 장치을 사용할 수 있도록하지 않을 사용자가 엔비디아 그래픽 카드가없는 경우가 있습니다.

모든 다른 OpenCL SDK는 공급 업체별 확장 기능을 제공하며 이는 공급 업체 런타임에 의해 이해됩니다.

+0

예.하지만 대상 플랫폼에는 APU (AMD의 통합 GPU가있는 CPU)와 Nvidia GPU가 있습니다. 동일한 프로그램 내에서 두 곳 모두에 액세스하려고합니다. 아마도 플랫폼 ID가 2 개가 될 것이고, 그 중 하나에는 2 개의 장치가 있고 다른 하나에는 1 개의 장치가 있습니다. – Tomas

+1

예, OpenCL API에서 두 플랫폼과 세 장치 모두를 확보하십시오. "SDK"에 링크 할 필요가 없습니다. OpenCL을 사용하면 시스템에 설치된 모든 플랫폼에 액세스 할 수 있습니다. 동시에 더 빨리 사용하고 싶습니까? 그렇다면 완전히 다른 질문이므로 다중 gpu 계산을 수행하려고합니다. 그래? – Thomas

+0

예, OpenCL로 다중 GPU + CPU 계산을하고 싶습니다. 그리고 위의 질문에 대한 의견에서 언급했듯이 LD_LIBRARY_PATH가 libOpenCL.so를 가리 키도록해야합니다. 서로 다른 공급 업체의 2 개의 장치를 사용하면 libOpenCL.so가 2 개 있습니다. 질문은 한 응용 프로그램에서 두 가지를 모두 사용하는 방법입니다. – Tomas

4

Khronos OpenCL 작업 그룹은 여러 공급 업체 드라이버를 시스템에 설치할 수있는 ICD 계층 (설치 가능한 클라이언트 드라이버)을 정의했습니다. 응용 프로그램은 ICD 계층을 통해 공급 업체 드라이버에 액세스합니다. 자세한 내용은 cl_khr_icd.txt을 참조하십시오.

+0

cl_khr_icd.tx는 아주 잘 설명되어 있습니다. 나는 인터넷에서 오랜 시간 동안 검색하지만 어떤 것도 발견하지 못했지만이 텍스트 파일을 통해 전체 시나리오를 이해합니다. –

2

여러 OpenCL 장치에서 동시에 실행하는 것과 관련이 있습니다. 여러 장치에서 실행하려면 각 장치/공급 업체에 대해 별도의 컨텍스트를 만들고 각각을 별도의 스레드에서 실행하십시오. 예를 들어 저는 GTX 590을 가지고 있습니다. 이것은 두 개의 GTX 590 장치로 나타납니다. 인텔 i7 프로세서도 있습니다. 세 가지 컨텍스트를 만듭니다. 두 개는 590 장치 용이고 두 개는 CPU 용이고 SDL_CreateThread를 사용하는 세 스레드에서 각 컨텍스트/장치를 실행합니다 (pthreads도 잘 작동 함). 좋은 결과를 얻으려면 각 장치의 작업 속도를 "속도"에 비례하여 늘려야합니다. 예를 들어 각 GTX 590의 경우 45 %, CPU의 경우 10 %입니다. 사용할 최상의 가중치는 응용 프로그램에 따라 다릅니다.