Benchmark copy of data from one pool to another pool either in
one or both directions. Users can enumerate the pools reported by system to specify which pools serve as source / destination Change-Id: I8e6d0adb3743b3328dd3ce9152762ca840ea613b
This commit is contained in:
+114
@@ -0,0 +1,114 @@
|
||||
#include "common.hpp"
|
||||
#include "rocm_async.hpp"
|
||||
|
||||
// @brief: Helper method to iterate throught the memory pools of
|
||||
// an agent and discover its properties
|
||||
hsa_status_t MemPoolInfo(hsa_amd_memory_pool_t pool, void* data) {
|
||||
|
||||
hsa_status_t status;
|
||||
RocmAsync* asyncDrvr = reinterpret_cast<RocmAsync*>(data);
|
||||
|
||||
// Query pools' segment, report only pools from global segment
|
||||
hsa_amd_segment_t segment;
|
||||
status = hsa_amd_memory_pool_get_info(pool,
|
||||
HSA_AMD_MEMORY_POOL_INFO_SEGMENT, &segment);
|
||||
ErrorCheck(status);
|
||||
if (HSA_AMD_SEGMENT_GLOBAL != segment) {
|
||||
return HSA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Determine if allocation is allowed in this pool
|
||||
// Report only pools that allow an alloction by user
|
||||
bool alloc = false;
|
||||
status = hsa_amd_memory_pool_get_info(pool,
|
||||
HSA_AMD_MEMORY_POOL_INFO_RUNTIME_ALLOC_ALLOWED, &alloc);
|
||||
ErrorCheck(status);
|
||||
if (alloc != true) {
|
||||
return HSA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// Query the max allocatable size
|
||||
size_t max_size = 0;
|
||||
status = hsa_amd_memory_pool_get_info(pool,
|
||||
HSA_AMD_MEMORY_POOL_INFO_SIZE, &max_size);
|
||||
ErrorCheck(status);
|
||||
|
||||
// Determine if the pools is accessible to all agents
|
||||
bool access_to_all = false;
|
||||
status = hsa_amd_memory_pool_get_info(pool,
|
||||
HSA_AMD_MEMORY_POOL_INFO_ACCESSIBLE_BY_ALL, &access_to_all);
|
||||
ErrorCheck(status);
|
||||
|
||||
// Determine type of access to owner agent
|
||||
hsa_amd_memory_pool_access_t owner_access;
|
||||
hsa_agent_t agent = asyncDrvr->agent_list_.back().agent_;
|
||||
status = hsa_amd_agent_memory_pool_get_info(agent, pool,
|
||||
HSA_AMD_AGENT_MEMORY_POOL_INFO_ACCESS, &owner_access);
|
||||
ErrorCheck(status);
|
||||
|
||||
// Determine if the pool is fine-grained or coarse-grained
|
||||
uint32_t flag = 0;
|
||||
status = hsa_amd_memory_pool_get_info(pool,
|
||||
HSA_AMD_MEMORY_POOL_INFO_GLOBAL_FLAGS, &flag);
|
||||
ErrorCheck(status);
|
||||
bool is_kernarg = (HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_KERNARG_INIT & flag);
|
||||
bool is_fine_grained = (HSA_AMD_MEMORY_POOL_GLOBAL_FLAG_FINE_GRAINED & flag);
|
||||
|
||||
// Update the pool handle for system memory if kernarg is true
|
||||
if (is_kernarg) {
|
||||
asyncDrvr->sys_pool_ = pool;
|
||||
}
|
||||
|
||||
// Create an instance of agent_pool_info and add it to the list
|
||||
pool_info_t pool_info(agent, asyncDrvr->agent_index_, pool,
|
||||
segment, max_size, asyncDrvr->pool_index_,
|
||||
is_fine_grained, is_kernarg,
|
||||
access_to_all, owner_access);
|
||||
asyncDrvr->pool_list_.push_back(pool_info);
|
||||
|
||||
// Create an agent_pool_infot and add it to its list
|
||||
asyncDrvr->agent_pool_list_[asyncDrvr->agent_index_].pool_list.push_back(pool_info);
|
||||
asyncDrvr->pool_index_++;
|
||||
|
||||
return HSA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
// @brief: Helper method to iterate throught the agents of
|
||||
// a system and discover its properties
|
||||
hsa_status_t AgentInfo(hsa_agent_t agent, void* data) {
|
||||
|
||||
RocmAsync* asyncDrvr = reinterpret_cast<RocmAsync*>(data);
|
||||
|
||||
// Get the name of the agent
|
||||
char agent_name[64];
|
||||
hsa_status_t status;
|
||||
status = hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, agent_name);
|
||||
ErrorCheck(status);
|
||||
|
||||
// Get device type
|
||||
hsa_device_type_t device_type;
|
||||
status = hsa_agent_get_info(agent, HSA_AGENT_INFO_DEVICE, &device_type);
|
||||
ErrorCheck(status);
|
||||
|
||||
// Capture the handle of Cpu agent
|
||||
if (device_type == HSA_DEVICE_TYPE_CPU) {
|
||||
asyncDrvr->cpu_agent_ = agent;
|
||||
}
|
||||
|
||||
asyncDrvr->agent_list_.push_back(agent_info(agent, asyncDrvr->agent_index_, device_type));
|
||||
|
||||
// Contruct an new agent_pool_info structure and add it to the list
|
||||
agent_pool_info node;
|
||||
node.agent = asyncDrvr->agent_list_.back();
|
||||
asyncDrvr->agent_pool_list_.push_back(node);
|
||||
|
||||
status = hsa_amd_agent_iterate_memory_pools(agent, MemPoolInfo, asyncDrvr);
|
||||
asyncDrvr->agent_index_++;
|
||||
|
||||
return HSA_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void RocmAsync::DiscoverTopology() {
|
||||
err_ = hsa_iterate_agents(AgentInfo, this);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user