2016-09-14 2 views
1

GPUDevice 코드에서 GPUDeviceContext이 스트림별로 만들어져 있음을 발견했습니다.TensorFlow 장치 컨텍스트, 스트림 및 컨텍스트 스위칭

모든 컨텍스트에서 하나의 OpKernelContext를 제어 할 수 있고 다양한 스트림을 실행해야하므로이 컨텍스트는 다른 데이터/코드를 GPU에 푸시 한 다음 실행하는 컨텍스트를 전환 할 수 있습니다.

다양한 스트림이 다른 장치 (예 : '/ gpu : 0'및 '/ gpu : 1')로 등록 되나요?

this마다 ThreadPoolDevice에는 컨텍스트가 없지만 ThreadPoolDevice에 컨텍스트를 추가하면 ThreadContext의 일종으로 가장 적합할까요?

답변

1

GPU의 경우 계산 스트림 (대부분의 계산 커널이 실행되는 스트림)과 일부 memcopy 스트림 (호스트와 장치 사이에서 memcopies를 실행하거나 그 반대의 경우)을 실행 스트림으로 유지합니다. 이는 GPU 장치에서 통신 및 계산을 겹치기 위해 수행되지만 GPU를 사용하는 방식과 관련이 있습니다. 또한 모든 계산과 통신을 위해 하나의 GPU 스트림을 쉽게 생성 할 수 있으며 속도는 더 빠르지 만 정확합니다.

계산을 수행하는 커널에 계산 스트림을 제공하고 복사를 수행하는 커널에 memcopy 스트림을 제공하려고합니다. 각 스트림에 대해 GPUDeviceContext 객체를 만든 다음 올바른 디바이스 컨텍스트 객체를 OpKernelContext에 전달합니다.

여기의 특정 구현은 비동기 하드웨어 장치 (GPU)의 속성을 반영하므로 ThreadPoolDevice에는 이러한 종류의 메커니즘이 없습니다. CPU에서 모든 계산은 동기식이므로 스트림과 같은 추상화가 필요 없습니다.

사용자 지정 하드웨어의 실행 모델은 TensorFlow에서 사용자 지정 장치 지원이 요구하는 상태 및 관리의 종류를 결정할 수 있습니다.

+0

나는 또한 장치 컨텍스트의 실제 초기화에 관심이 있었지만'BaseGPUDevice' 생성자에서 초기화 한 다음'FillContextMap'을 실행할 때까지 유지하는 것으로 보입니다. 궁극적으로 실행 엔진에 null 컨텍스트가있는 이유는 궁금합니다. 내가 컨텍스트 맵에 넣지 않았기 때문이라고 가정합니다. nullptr 문제가 발생할 수 있음을 확인할 수 있습니까? https://github.com/tensorflow/tensorflow/blob/73ced9d797056c7e67a06ed2098dd809d85ec44a/tensorflow/core/common_runtime/gpu/gpu_device.cc#L338 –

관련 문제