diff --git a/projects/rocr-runtime/samples/GetInfo/get_info.cpp b/projects/rocr-runtime/samples/GetInfo/get_info.cpp index 834416efca..fe5e4a04a7 100644 --- a/projects/rocr-runtime/samples/GetInfo/get_info.cpp +++ b/projects/rocr-runtime/samples/GetInfo/get_info.cpp @@ -17,6 +17,7 @@ void GetInfo::Run() { std::cout << "------------------------------------------------\n"; AgentProps prop(cpu); PrintAgentInfo(prop); + PrintPeers(cpu); std::cout << "------------------------------------------------\n"; hsa_amd_memory_pool_t global_fine = global_fine_[cpu.handle]; @@ -48,6 +49,7 @@ void GetInfo::Run() { std::cout << "------------------------------------------------\n"; AgentProps prop(gpu); PrintAgentInfo(prop); + PrintPeers(gpu); std::cout << "------------------------------------------------\n"; hsa_amd_memory_pool_t global_coarse = global_coarse_[gpu.handle]; diff --git a/projects/rocr-runtime/samples/GetInfo/get_info.h b/projects/rocr-runtime/samples/GetInfo/get_info.h index 1c20f7902e..23b6b2d869 100644 --- a/projects/rocr-runtime/samples/GetInfo/get_info.h +++ b/projects/rocr-runtime/samples/GetInfo/get_info.h @@ -1,7 +1,7 @@ #ifndef GET_INFO_H #define GET_INFO_H -#include "common/hsa_test.h" +#include "samples/common/hsa_test.h" class GetInfo : public HsaTest { public: diff --git a/projects/rocr-runtime/samples/common/hsa_test.cpp b/projects/rocr-runtime/samples/common/hsa_test.cpp index 5c1b8a6676..a659c5eb71 100644 --- a/projects/rocr-runtime/samples/common/hsa_test.cpp +++ b/projects/rocr-runtime/samples/common/hsa_test.cpp @@ -243,6 +243,30 @@ bool HsaTest::Kernel::CreateCodeObjectAndExecutable() { return true; } +void HsaTest::GetGpuPeer(hsa_agent_t master, + std::vector& gpu_peers) { + AgentProps master_prop(master); + for (hsa_agent_t agent : gpus_) { + AgentProps agent_prop(agent); + if (master.handle == agent.handle || + agent_prop.device_type != HSA_DEVICE_TYPE_GPU) { + continue; + } + + hsa_amd_memory_pool_t peer_local_pool = global_coarse_[agent.handle]; + + hsa_amd_memory_pool_access_t access = + HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED; + if (HSA_STATUS_SUCCESS == hsa_amd_agent_memory_pool_get_info( + master, peer_local_pool, + HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS, + (void*)&access) && + access != HSA_AMD_MEMORY_POOL_ACCESS_NEVER_ALLOWED) { + gpu_peers.push_back(agent); + } + } +} + void* HsaTest::AllocateSystemMemory(bool fine_grain, size_t size) { if (cpus_.size() == 0) { return NULL; @@ -423,6 +447,27 @@ void HsaTest::PrintAgentInfo(AgentProps& prop) { PRINT_ATTRIBUTE(HSA_AGENT_INFO_VERSION_MINOR, prop.version_minor, ""); } +void HsaTest::PrintPeers(hsa_agent_t agent) { + std::cout << "Peer GPUs: "; + std::vector gpu_peers; + GetGpuPeer(agent, gpu_peers); + if (gpu_peers.size() > 0) { + for (hsa_agent_t peer_agent : gpu_peers) { + // Get the index of the peer in gpus_. + size_t peer_idx = 0; + for (; peer_idx < gpus_.size(); ++peer_idx) { + if (peer_agent.handle == gpus_[peer_idx].handle) { + std::cout << "GPU[" << peer_idx << "] "; + break; + } + } + } + std::cout << std::endl; + } else { + std::cout << "No peer GPUs\n"; + } +} + void HsaTest::PrintPoolInfo(PoolProps& prop) { const char* segment_strings[] = { "HSA_SEGMENT_GLOBAL", "HSA_AMD_SEGMENT_READONLY", diff --git a/projects/rocr-runtime/samples/common/hsa_test.h b/projects/rocr-runtime/samples/common/hsa_test.h index aa4fb1642e..96c191574b 100644 --- a/projects/rocr-runtime/samples/common/hsa_test.h +++ b/projects/rocr-runtime/samples/common/hsa_test.h @@ -96,6 +96,8 @@ class HsaTest { std::string hsail_file_; }; + virtual void GetGpuPeer(hsa_agent_t master, + std::vector& gpu_peers); virtual void* AllocateSystemMemory(bool fine_grain, size_t size); virtual void* AllocateLocalMemory(hsa_agent_t agent, size_t size); virtual void FreeMemory(void* ptr); @@ -104,6 +106,7 @@ class HsaTest { void* packet); virtual void PrintAgentInfo(AgentProps& prop); + virtual void PrintPeers(hsa_agent_t agent); virtual void PrintPoolInfo(PoolProps& prop); std::string test_name_;