2017-05-17 6 views
1

하나가 어떤 장치 (A GPU)를 제공하는 금속 장치와 새로운 CIContext 사용 만들 때 :맥 프로

let context = CIContext(
    mtlDevice: device 
) 

을 내 맥북 프로에 대한 타겟팅 할 수있는 두 GPU 카드가 헤드리스 모드에서 생산에 사용 될 맥 프로에 그러나

guard 
    let device:MTLDevice = MTLCreateSystemDefaultDevice() 
else { 
    exit(EXIT_FAILURE) 
} 

: 개발 목적은 항상 MTLCreateSystemDefaultDevice() 방법으로 화면에 연결된 장치를 선택합니다. 한 프로 내 Mac에서 다음과 같은 출력을 제공 MTLCopyAllDevices() 방법을 사용할 수 있습니다 사용 가능한 모든 장치를 얻기 위하여 :

는 는 는

이 맥 프로는 두 번째와마다마다 작은 작업의 수백에 크게 활용 될 것입니다 새 작업은 오는

[ 
    <MTLDebugDevice: 0x103305450> -> <BronzeMtlDevice: 0x10480a200> 
    name = AMD Radeon HD - FirePro D700 

    <MTLDebugDevice: 0x103307730> -> <BronzeMtlDevice: 0x104814800> 
    name = AMD Radeon HD - FirePro D700 
] 
작업이 처리 될 GPU 장치를 선택해야합니다.

let devices = MTLCopyAllDevices() // get all available devices 
let rand = Int(arc4random_uniform(UInt32(devices.count))) // random index 
let device = devices[rand] // randomly selected GPU to use 

let context = CIContext(
    mtlDevice: device 
) 

항상 대상으로 맥 프로에 두 개의 동일한 GPU 장치가 있기 때문에 하나가 자원의 낭비가 될 것입니다 : -

이제 질문은 위의 배열에서 좋은 아이디어를 임의의 장치를 따기입니다 . Logic은 위의 코드를 사용하면 두 GPU가 똑같이 활용되지만 어쩌면 내가 틀렸고 MacOS가 실행시 활용도가 낮은 GPU를 지능적으로 선택할 수있는 일종의 추상화 레이어를 제공한다고 알려줍니다.

미리 감사드립니다.

답변

0

왜 둘 사이를 바꾸지 않는 것이 좋을까요? 여러 스레드에서 명령 버퍼를 저지르고있는 경우에도 작업은 거의 균일하게 확산되어야한다

device = devices[taskIndex % devices.count] 

또한, 모든 작업에 대해 CIContext들 만들지 않도록해야합니다; 그것들은 값이 비싸므로 대신 컨텍스트 (장치 당 하나) 목록을 유지해야합니다.

핵심 작업 (코어 이미지 필터링과 반대되는 작업)을 수행하는 경우 각 장치에 대한 명령 대기열이 있어야하며 사용하려는 모든 리소스가 (자원은 MTLDevice에 의해 공유 될 수 없습니다).

+0

안녕하세요. 워렌, 귀하의 의견에 감사드립니다. 불행히도 나는'taskIndex'를 추적 할 수 없다. 이것은 태스크가 들어 오면 실행되는 커맨드 라인 애플리케이션이다. 즉, ~ 200ms 동안 만 "살아"있다. 'CIContext'와 관련해서 저는 처음부터 모든 작업을 만들고 그 상황에서 처리하는 것만 만듭니다. – Pono

+0

흥미 롭습니다. 나는 당신이 명령 줄을 통해 추천 된 장치 색인을 통과하고 그것을 그런 방식으로 할 수 있는지 의아하게 생각한다. – warrenm