我没有访问多gpu系统来测试它,但在cuda.h中我发现了两件似乎很相似的东西。第一个是函数
CUresult CUDAAPI cuDeviceCanAccessPeer(int *canAccessPeer, CUdevice dev, CUdevice peerDev);
描述为
如果
*canAccessPeer
上的上下文能够直接从1
和dev
的上下文访问内存,则peerDev
的值为0
。如果可以从peerDev
直接访问dev
,则可以通过调用::cuCtxEnablePeerAccess()
在两个特定上下文中启用访问。
第二个是
CUresult CUDAAPI cuDeviceGetP2PAttribute(int* value, CUdevice_P2PAttribute attrib, CUdevice srcDevice, CUdevice dstDevice);
描述为
返回
*value the
和attrib
之间链接的请求属性srcDevice
的{{1}}值。支持的属性是:
dstDevice
:表示两个设备之间链接性能的相对值。
::CU_DEVICE_P2P_ATTRIBUTE_PERFORMANCE_RANK
P2::CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED
1`如果启用P2P访问。
:
如果支持链接上的原子操作。
名称::CU_DEVICE_P2P_ATTRIBUTE_NATIVE_ATOMIC_SUPPORTED: 1
表示调用CU_DEVICE_ATTRUBUTE_ACCESS_SUPPORTED
与cuDeviceCanAccessPeer
使用cuDeviceGetP2PAttribute
设置为attrib
相同,但说明为“{ {1}}如果启用P2P访问“会让我感到困惑。
它们是否真的相同,或者第二个应该测试链接是否已被激活?
答案 0 :(得分:0)
我不相信它们是一样的。
cuDeviceCanAccessPeer
返回两个设备之间的P2P访问是否可能。cuDeviceGetP2PAttribute
返回两个设备之间是否启用了启用P2P访问。如果未事先成功调用cuCtxEnablePeerAccess
,cuDeviceGetP2PAttribute
在查询CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED
属性时应返回false,即使cuDeviceCanAccessPeer
返回true也是如此。
请注意,我目前还无法访问支持P2P的系统来检查此内容。