TL; DR
что это за соединение между устройствами?
Как заявил Альмог Дэвид в комментариях, это говорит о том, имеет ли один графический процессор прямой доступ к памяти другого.
как это влияет на вычислительную мощность?
Единственный эффект, который это имеет, - это тренировка с несколькими GPU. Передача данных происходит быстрее, если два графических процессора имеют соединение между устройствами.
почему он отличается для разных графических процессоров?
Это зависит от топологии настройки оборудования. Материнская плата имеет только столько слотов PCI-e, которые подключены к одной шине. (проверьте топологию с nvidia-smi topo -m
)
может ли он меняться со временем по аппаратным причинам (сбои, несоответствие драйверов ...)?
Я не думаю, что со временем порядок может измениться, если только NVIDIA не изменит схему перечисления по умолчанию. Здесь немного подробнее здесь
Explaination
Это сообщение генерируется в функции BaseGPUDeviceFactory::CreateDevices
. Он перебирает каждую пару устройств в указанном порядке и вызывает cuDeviceCanAccessPeer
. Как упоминает Альмог Дэвид в комментариях, это просто указывает, можете ли вы выполнять DMA между устройствами.
Вы можете выполнить небольшой тест, чтобы убедиться, что порядок имеет значение. Рассмотрим следующий фрагмент:
#test.py
import tensorflow as tf
#allow growth to take up minimal resources
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
Теперь давайте проверим вывод с другим порядком устройства в CUDA_VISIBLE_DEVICES
$ CUDA_VISIBLE_DEVICES=0,1,2,3 python3 test.py
...
2019-03-26 15:26:16.111423: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1, 2, 3
2019-03-26 15:26:18.635894: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-03-26 15:26:18.635965: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988] 0 1 2 3
2019-03-26 15:26:18.635974: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0: N Y N N
2019-03-26 15:26:18.635982: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1: Y N N N
2019-03-26 15:26:18.635987: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 2: N N N Y
2019-03-26 15:26:18.636010: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 3: N N Y N
...
$ CUDA_VISIBLE_DEVICES=2,0,1,3 python3 test.py
...
2019-03-26 15:26:30.090493: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0, 1, 2, 3
2019-03-26 15:26:32.758272: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-03-26 15:26:32.758349: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988] 0 1 2 3
2019-03-26 15:26:32.758358: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0: N N N Y
2019-03-26 15:26:32.758364: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 1: N N Y N
2019-03-26 15:26:32.758389: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 2: N Y N N
2019-03-26 15:26:32.758412: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 3: Y N N N
...
Более подробное объяснение соединений можно получить, запустив nvidia-smi topo -m
. Например:
GPU0 GPU1 GPU2 GPU3 CPU Affinity
GPU0 X PHB SYS SYS 0-7,16-23
GPU1 PHB X SYS SYS 0-7,16-23
GPU2 SYS SYS X PHB 8-15,24-31
GPU3 SYS SYS PHB X 8-15,24-31
Legend:
X = Self
SYS = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
PXB = Connection traversing multiple PCIe switches (without traversing the PCIe Host Bridge)
PIX = Connection traversing a single PCIe switch
NV# = Connection traversing a bonded set of # NVLinks
Я полагаю, что чем ниже вы идете в списке, тем быстрее будет передача.