1 /* Copyright 2015 The TensorFlow Authors. All Rights Reserved. 2 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 7 http://www.apache.org/licenses/LICENSE-2.0 8 9 Unless required by applicable law or agreed to in writing, software 10 distributed under the License is distributed on an "AS IS" BASIS, 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 See the License for the specific language governing permissions and 13 limitations under the License. 14 ==============================================================================*/ 15 16 #ifndef TENSORFLOW_CORE_COMMON_RUNTIME_GPU_GPU_ID_H_ 17 #define TENSORFLOW_CORE_COMMON_RUNTIME_GPU_GPU_ID_H_ 18 19 #include "tensorflow/core/lib/gtl/int_type.h" 20 21 namespace tensorflow { 22 23 // There are three types of GPU ids: 24 // - *physical* GPU id: this is the integer index of a GPU hardware in the 25 // physical machine, it can be filtered by CUDA environment variable 26 // CUDA_VISIBLE_DEVICES. Note that this id is not visible to Tensorflow, but 27 // result after filtering by CUDA_VISIBLE_DEVICES is visible to TF and is 28 // called platform GPU id as below. See 29 // http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#env-vars 30 // for more details. 31 // - *platform* GPU id (also called *visible* GPU id in 32 // third_party/tensorflow/core/protobuf/config.proto): this is the id that is 33 // visible to Tensorflow after filtering by CUDA_VISIBLE_DEVICES, and is 34 // generated by the CUDA GPU driver. It starts from 0 and is used for CUDA API 35 // calls like cuDeviceGet(). 36 // - TF GPU id (also called *virtual* GPU id in 37 // third_party/tensorflow/core/protobuf/config.proto): this is the id that 38 // Tensorflow generates and exposes to its users. It is the id in the <id> 39 // field of the device name "/device:GPU:<id>", and is also the identifier of 40 // a BaseGPUDevice. Note that the configuration allows us to create multiple 41 // BaseGPUDevice per GPU hardware in order to use multi CUDA streams on the 42 // hardware, so the mapping between TF GPU id and platform GPU id is not a 1:1 43 // mapping, see the example below. 44 // 45 // For example, assuming that in the machine we have GPU device with index 0, 1, 46 // 2 and 3 (physical GPU id). Setting "CUDA_VISIBLE_DEVICES=1,2,3" will create 47 // the following mapping between platform GPU id and physical GPU id: 48 // 49 // platform GPU id -> physical GPU id 50 // 0 -> 1 51 // 1 -> 2 52 // 2 -> 3 53 // 54 // Note that physical GPU id 0 is invisible to TF so there is no mapping entry 55 // for it. 56 // 57 // Assuming we configure the Session to create one BaseGPUDevice per GPU 58 // hardware, then setting GPUOptions::visible_device_list to "2,0" will create 59 // the following mappting between TF GPU id and platform GPU id: 60 // 61 // TF GPU id -> platform GPU ID 62 // 0 (i.e. /device:GPU:0) -> 2 63 // 1 (i.e. /device:GPU:1) -> 0 64 // 65 // Note that platform GPU id 1 is filtered out by 66 // GPUOptions::visible_device_list, so it won't be used by the TF process. 67 // 68 // On the other hand, if we configure it to create 2 BaseGPUDevice per GPU 69 // hardware, then setting GPUOptions::visible_device_list to "2,0" will create 70 // the following mappting between TF GPU id and platform GPU id: 71 // 72 // TF GPU id -> platform GPU ID 73 // 0 (i.e. /device:GPU:0) -> 2 74 // 1 (i.e. /device:GPU:1) -> 2 75 // 2 (i.e. /device:GPU:2) -> 0 76 // 3 (i.e. /device:GPU:3) -> 0 77 // 78 // We create strong-typed integer classes for both TF GPU id and platform GPU id 79 // to minimize programming errors and improve code readability. Except for the 80 // StreamExecutor interface (as we don't change its API), whenever we need a 81 // TF GPU id (or platform GPU id) we should use TfGpuId (or PlatformGpuId) 82 // instead of a raw integer. 83 TF_LIB_GTL_DEFINE_INT_TYPE(TfGpuId, int32); 84 TF_LIB_GTL_DEFINE_INT_TYPE(PlatformGpuId, int32); 85 86 } // namespace tensorflow 87 88 #endif // TENSORFLOW_CORE_COMMON_RUNTIME_GPU_GPU_ID_H_ 89