Cuda 什么';cuDeviceCanAccessPeer(…)和CUDeviceGetP2PatAttribute(…,CU_设备_P2P_属性_访问_受支持,…)之间的区别是什么?

Cuda 什么';cuDeviceCanAccessPeer(…)和CUDeviceGetP2PatAttribute(…,CU_设备_P2P_属性_访问_受支持,…)之间的区别是什么?,cuda,multi-gpu,Cuda,Multi Gpu,我没有访问多gpu系统来测试这一点,但在cuda.h中,我发现了两个非常相似的东西。首先是功能 CUresult CUDAAPI cuDeviceCanAccessPeer(int *canAccessPeer, CUdevice dev, CUdevice peerDev); 形容为 如果dev上的上下文能够从peerDev上的上下文直接访问内存,则在*canAccessPeer中返回1的值,否则返回0。如果可以从dev直接访问peerDev,则可以通过调用:cuctxenablel

我没有访问多gpu系统来测试这一点,但在cuda.h中,我发现了两个非常相似的东西。首先是功能

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

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

第二个是

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

*值中返回
srcDevice
dstDevice
之间链接的请求属性
attrib
的值。支持的属性包括:

::CU\u设备\u P2P\u属性\u性能\u排名
:指示两个设备之间链路性能的相对值

::CU\u设备\u P2P\u属性\u访问受支持
P2
1`如果启用了P2P访问

::CU\u设备\u P2P\u属性\u本机\u原子\u支持:1
如果支持通过链接进行原子操作

支持的名称
CU\u设备\u属性\u访问
表明调用
cuDeviceCanAccessPeer
与使用
CUDeviceGetP2PatAttribute
时相同,且
attrib
设置为
::CU\u设备\u P2P\u属性\u访问
支持的P2P
,但如果启用P2P访问,则说明“
1
”我很困惑


它们真的是一样的,还是第二个应该测试链接是否被激活?

我不相信它们是一样的

  • cuDeviceCanAccessPeer
    返回两台设备之间是否可以进行P2P访问
  • CUDeviceGetP2PatAttribute
    返回两台设备之间是否启用了P2P访问
如果事先没有成功调用
cuctxenablepeercess
cuDeviceGetP2PAttribute
在查询
CU\u DEVICE\u P2P\u ATTRIBUTE\u ACCESS\u SUPPORTED
属性时应返回false,即使
cuDeviceCanAccessPeer
返回true


请注意,我目前也无法访问启用P2P的系统来检查这一点。

似乎是这样,但另一方面,属性名称
CU\u DEVICE\u P2P\u attribute\u access\u SUPPORTED
让我有点困惑。