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