Changes 5 hsail apps for supporting gfx803.

[git-p4: depot-paths = "//depot/stg/hsa/drivers/hsa/runtime/": change = 1235366]


[ROCm/ROCR-Runtime commit: df99562905]
This commit is contained in:
Ding, Wei (xN/A) TX
2016-02-08 15:39:18 -05:00
parent 275cb22707
commit a1837859ef
4 changed files with 105 additions and 19 deletions
@@ -2,9 +2,10 @@
#include "HSAILAmdExt.h"
void HSA_UTIL::GetHsailNameAndKernelName(char * file_name, char *kernel_name)
void HSA_UTIL::GetHsailNameAndKernelName(char * file_name_full, char *file_name_base, char *kernel_name)
{
strcpy(hail_file_name, file_name);
strcpy(hail_file_name_full, file_name_full);
strcpy(hail_file_name_base, file_name_base);
strcpy(hsa_kernel_name, kernel_name);
}
@@ -56,19 +57,30 @@ bool HSA_UTIL::HsaInit()
err = hsa_queue_create(device, queue_size, HSA_QUEUE_TYPE_MULTI, NULL, NULL, 0, 0, &command_queue);
check(Creating the queue, err);
profile = hsa_profile_t(108);
hsa_agent_get_info(device, HSA_AGENT_INFO_PROFILE, &profile);
if (profile == HSA_PROFILE_BASE)
{
memset(hail_file_name_full, 0, sizeof(char)*128);
cout << "Loading base profile!!!" << endl;
strcpy(hail_file_name_full, hail_file_name_base); //overwrite full hsail file name with base
}
amd::hsail::registerExtensions();
if (!tool.assembleFromFile(hail_file_name)) {
if (!tool.assembleFromFile(hail_file_name_full))
{
std::cout << tool.output();
return false;
}
module = tool.brigModule();
// Create hsail program.
err = hsa_ext_program_create(HSA_MACHINE_MODEL_LARGE, HSA_PROFILE_FULL, HSA_DEFAULT_FLOAT_ROUNDING_MODE_ZERO, NULL, &hsa_program);
err = hsa_ext_program_create(HSA_MACHINE_MODEL_LARGE, profile, HSA_DEFAULT_FLOAT_ROUNDING_MODE_ZERO, NULL, &hsa_program);
check("Error in creating program object", err);
// Add hsail module.
//cout << "hsail file name = " << hail_file_name << endl;
//cout << "hsail file name = " << hail_file_name_full << endl;
err = hsa_ext_program_add_module(hsa_program, module);
check("Error in adding module to program object", err);
@@ -90,7 +102,7 @@ bool HSA_UTIL::HsaInit()
check("Error in finalizing program object", err);
// Create executable.
err = hsa_executable_create(HSA_PROFILE_FULL, HSA_EXECUTABLE_STATE_UNFROZEN, "", &hsaExecutable);
err = hsa_executable_create(profile, HSA_EXECUTABLE_STATE_UNFROZEN, "", &hsaExecutable);
check("Error in creating executable object", err);
// Load code object.
@@ -117,9 +129,11 @@ bool HSA_UTIL::HsaInit()
//hsa_region_t local_kernarg_region;
kernarg_region.handle = 0;
hsa_agent_iterate_regions(device, get_kernarg, &kernarg_region);
err = (kernarg_region.handle== 0) ? HSA_STATUS_ERROR : HSA_STATUS_SUCCESS;
mem_region.kernarg_region.handle = 0;
mem_region.coarse_region.handle = 0;
hsa_agent_iterate_regions(device, get_memory_region, &mem_region);
err = (mem_region.kernarg_region.handle== 0) ? HSA_STATUS_ERROR : HSA_STATUS_SUCCESS;
check(Finding a kernarg memory region, err);
return true;
@@ -177,7 +191,7 @@ double HSA_UTIL::Run(int dim, int group_x, int group_y, int group_z, int s_size,
/*
* Allocate the kernel argument buffer from the correct region.
*/
err = hsa_memory_allocate(kernarg_region, kernel_args_size, &local_kernel_arg_buffer);
err = hsa_memory_allocate(mem_region.kernarg_region, kernel_args_size, &local_kernel_arg_buffer);
check(Allocating kernel argument memory buffer, err);
memcpy(local_kernel_arg_buffer, kernel_args, kernel_args_size);
local_dispatch_packet.kernarg_address = local_kernel_arg_buffer;
@@ -246,3 +260,50 @@ void HSA_UTIL::Close()
check(Shutting down the runtime, err);
}
void* HSA_UTIL::AllocateLocalMemory(size_t size)
{
void *buffer = NULL;
// Allocate in local memory only if it is available
if (mem_region.coarse_region.handle != 0)
{
cout << "Allocating in local memory" << endl;
err = hsa_memory_allocate(mem_region.coarse_region, size, (void **)&buffer);
check(hsa memory allocation in local memory, err);
// register agent
err = hsa_memory_assign_agent(buffer, device, HSA_ACCESS_PERMISSION_RW);
return (err == HSA_STATUS_SUCCESS) ? buffer : NULL;
}
// Allocate in system memory if local memory is not available
cout << "Allocating in system memory" << endl;
err = hsa_memory_allocate(mem_region.kernarg_region, size, (void **)&buffer);
return (err == HSA_STATUS_SUCCESS) ? buffer : NULL;
}
void* HSA_UTIL::AllocateSysMemory( size_t size)
{
void *buffer = NULL;
err = hsa_memory_allocate(mem_region.kernarg_region, size, (void **)&buffer);
return (err == HSA_STATUS_SUCCESS) ? buffer : NULL;
}
bool HSA_UTIL::TransferData(void *dest, void *src, uint length, bool host_to_dev)
{
hsa_status_t status;
void *buffer = (host_to_dev) ? dest : src;
err = hsa_memory_assign_agent(buffer, device, HSA_ACCESS_PERMISSION_RW);
if (err != HSA_STATUS_SUCCESS)
{
return false;
}
err = hsa_memory_copy(dest, src, length); // first is dest, second is src
return (err == HSA_STATUS_SUCCESS);
}
@@ -11,28 +11,36 @@
#include "common.hpp"
#include "HSAILTool.h"
class HSA_UTIL{
public:
HSA_UTIL();
~HSA_UTIL();
public:
void GetHsailNameAndKernelName(char *hail_file_name, char *kernel_name);
void GetHsailNameAndKernelName(char *hail_file_name_full, char *hail_file_name_base, char *kernel_name);
bool HsaInit();
void Close();
double GetKernelTime();
double GetSetupTime();
void* AllocateLocalMemory(size_t size) ;
void* AllocateSysMemory(size_t size);
bool TransferData(void *dest, void *src, uint length, bool host_to_dev) ;
double Run(int dim, int group_x, int group_y, int group_z, int s_size, int grid_x, int grid_y, int grid_z, void* kernel_args, int kernel_args_size);
public:
hsa_status_t err;
uint32_t queue_size;
hsa_agent_t device;
hsa_region_t kernarg_region;
MemRegion mem_region;
//hsa_region_t kernarg_region;
// Memory region supporting kernel parameters
// hsa_region_t coarse_region;
// Hsail profile supported by agent
hsa_profile_t profile;
char hail_file_name[128];
char hail_file_name_full[128];
char hail_file_name_base[128];
char hsa_kernel_name[128];
hsa_queue_t* command_queue;
@@ -172,15 +172,22 @@ hsa_status_t find_gpu(hsa_agent_t agent, void *data)
* Determines if a memory region can be used for kernarg
* allocations.
*/
hsa_status_t get_kernarg(hsa_region_t region, void* data)
hsa_status_t get_memory_region(hsa_region_t region, void* data)
{
hsa_region_global_flag_t flags;
hsa_region_get_info(region, HSA_REGION_INFO_GLOBAL_FLAGS, &flags);
MemRegion *my_mem_region = (MemRegion *)data;
if (flags & HSA_REGION_GLOBAL_FLAG_COARSE_GRAINED) {
my_mem_region->coarse_region = region;
}
if (flags & HSA_REGION_GLOBAL_FLAG_KERNARG)
{
hsa_region_t* ret = (hsa_region_t*) data;
*ret = region;
my_mem_region->kernarg_region= region;
}
return HSA_STATUS_SUCCESS;
}
@@ -66,6 +66,16 @@ typedef uint8_t BrigExecutableModifier8_t;
typedef BrigDataOffset32_t BrigDataOffsetString32_t;
typedef struct {
// memory region accessed by GPU only
hsa_region_t coarse_region;
// system memory access by gpu and cpu
hsa_region_t kernarg_region;
} MemRegion;
/*
enum BrigKinds {
BRIG_KIND_NONE = 0x0000,
@@ -221,6 +231,6 @@ hsa_status_t find_gpu(hsa_agent_t agent, void *data);
* Determines if a memory region can be used for kernarg
* allocations.
*/
hsa_status_t get_kernarg(hsa_region_t region, void* data);
hsa_status_t get_memory_region(hsa_region_t region, void* data);
#endif