cuDeviceCanAccessPeer(...)和cuDeviceGetP2PAttribute(...,CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED,...)之间有什么区别?

时间:2016-10-26 09:27:01

标签: cuda multi-gpu

我没有访问多gpu系统来测试它,但在cuda.h中我发现了两件似乎很相似的东西。第一个是函数

    CUresult CUDAAPI cuDeviceCanAccessPeer(int *canAccessPeer, CUdevice dev, CUdevice peerDev);

描述为

  

如果*canAccessPeer上的上下文能够直接从1dev的上下文访问内存,则peerDev的值为0。如果可以从peerDev直接访问dev,则可以通过调用::cuCtxEnablePeerAccess()在两个特定上下文中启用访问。

第二个是

    CUresult CUDAAPI cuDeviceGetP2PAttribute(int* value, CUdevice_P2PAttribute attrib, CUdevice srcDevice, CUdevice dstDevice);

描述为

  

返回*value theattrib之间链接的请求属性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_SUPPORTEDcuDeviceCanAccessPeer使用cuDeviceGetP2PAttribute设置为attrib相同,但说明为“{ {1}}如果启用P2P访问“会让我感到困惑。

它们是否真的相同,或者第二个应该测试链接是否已被激活?

1 个答案:

答案 0 :(得分:0)

我不相信它们是一样的。

  • cuDeviceCanAccessPeer返回两个设备之间的P2P访问是否可能
  • cuDeviceGetP2PAttribute返回两个设备之间是否启用了启用P2P访问

如果未事先成功调用cuCtxEnablePeerAccesscuDeviceGetP2PAttribute在查询CU_DEVICE_P2P_ATTRIBUTE_ACCESS_SUPPORTED属性时应返回false,即使cuDeviceCanAccessPeer返回true也是如此。

请注意,我目前还无法访问支持P2P的系统来检查此内容。