我无法访问多 GPU 系统来测试这一点,但在 cuda.h 中我发现了两件看起来非常相似的事情。首先是功能
CUresult CUDAAPI cuDeviceCanAccessPeer(int *canAccessPeer, CUdevice dev, CUdevice peerDev);
被描述成
返回
*canAccessPeer
值1
是否上下文 ondev
能够直接从上下文访问内存peerDev
,0
否则返回。如果可以直接访问peerDev
fromdev
,则可以通过调用在两个特定上下文上启用访问::cuCtxEnablePeerAccess()
。
第二个是
CUresult CUDAAPI cuDeviceGetP2PAttribute(int* value, CUdevice_P2PAttribute attrib, CUdevice srcDevice, CUdevice dstDevice);
被描述成
返回和之间链接
*value the
的请求属性的值。支持的属性是:attrib
srcDevice
dstDevice
::CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK
:表示两个设备之间链路性能的相对值。
::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED
P2:
1` 如果启用 P2P 访问。
::CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED: 1
如果支持通过链接的原子操作。
该名称CU_DEVICE_ATTRUBUTE_ACCESS_SUPPORTED
表明调用 to 与cuDeviceCanAccessPeer
使用set to相同,但“如果启用 P2P 访问”的描述让我感到困惑。cuDeviceGetP2PAttribute
attrib
::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED P2P
1
它们真的一样吗,或者第二个应该测试链接是否已激活?