1d0b31295SJon Chesterfield /*===--------------------------------------------------------------------------
2d0b31295SJon Chesterfield  *              ATMI (Asynchronous Task and Memory Interface)
3d0b31295SJon Chesterfield  *
4d0b31295SJon Chesterfield  * This file is distributed under the MIT License. See LICENSE.txt for details.
5d0b31295SJon Chesterfield  *===------------------------------------------------------------------------*/
6d0b31295SJon Chesterfield #include "atmi_runtime.h"
7d0b31295SJon Chesterfield #include "internal.h"
8d0b31295SJon Chesterfield #include "machine.h"
9d0b31295SJon Chesterfield #include "rt.h"
10d0b31295SJon Chesterfield #include <cassert>
11d0b31295SJon Chesterfield #include <hsa.h>
12d0b31295SJon Chesterfield #include <hsa_ext_amd.h>
13d0b31295SJon Chesterfield #include <iostream>
14d0b31295SJon Chesterfield #include <stdio.h>
15d0b31295SJon Chesterfield #include <string.h>
16d0b31295SJon Chesterfield #include <thread>
17d0b31295SJon Chesterfield #include <vector>
18d0b31295SJon Chesterfield 
19d0b31295SJon Chesterfield using core::TaskImpl;
20d0b31295SJon Chesterfield extern ATLMachine g_atl_machine;
21d0b31295SJon Chesterfield 
22d0b31295SJon Chesterfield namespace core {
23d0b31295SJon Chesterfield 
247e9351b9SJon Chesterfield namespace {
258b79dfb3SPushpinder Singh ATLProcessor &get_processor_by_mem_place(int DeviceId,
268b79dfb3SPushpinder Singh                                          atmi_devtype_t DeviceType) {
278b79dfb3SPushpinder Singh   switch (DeviceType) {
28d0b31295SJon Chesterfield   case ATMI_DEVTYPE_CPU:
298b79dfb3SPushpinder Singh     return g_atl_machine.processors<ATLCPUProcessor>()[DeviceId];
30d0b31295SJon Chesterfield   case ATMI_DEVTYPE_GPU:
318b79dfb3SPushpinder Singh     return g_atl_machine.processors<ATLGPUProcessor>()[DeviceId];
32d0b31295SJon Chesterfield   }
33d0b31295SJon Chesterfield }
34d0b31295SJon Chesterfield 
358b79dfb3SPushpinder Singh hsa_amd_memory_pool_t get_memory_pool_by_mem_place(int DeviceId,
368b79dfb3SPushpinder Singh                                                    atmi_devtype_t DeviceType) {
378b79dfb3SPushpinder Singh   ATLProcessor &proc = get_processor_by_mem_place(DeviceId, DeviceType);
388b79dfb3SPushpinder Singh   return get_memory_pool(proc, 0 /*Memory Type (always zero) */);
39d0b31295SJon Chesterfield }
407e9351b9SJon Chesterfield } // namespace
41d0b31295SJon Chesterfield 
424fc32869SPushpinder Singh hsa_status_t Runtime::DeviceMalloc(void **ptr, size_t size, int DeviceId) {
434fc32869SPushpinder Singh   return Runtime::Malloc(ptr, size, DeviceId, ATMI_DEVTYPE_GPU);
444fc32869SPushpinder Singh }
454fc32869SPushpinder Singh 
464fc32869SPushpinder Singh hsa_status_t Runtime::HostMalloc(void **ptr, size_t size) {
47*9d110f91SPushpinder Singh   hsa_status_t Err = Runtime::Malloc(ptr, size, 0, ATMI_DEVTYPE_CPU);
48*9d110f91SPushpinder Singh   if (Err == HSA_STATUS_SUCCESS) {
49*9d110f91SPushpinder Singh     Err = core::allow_access_to_all_gpu_agents(*ptr);
50*9d110f91SPushpinder Singh   }
51*9d110f91SPushpinder Singh   return Err;
524fc32869SPushpinder Singh }
534fc32869SPushpinder Singh 
548b79dfb3SPushpinder Singh hsa_status_t Runtime::Malloc(void **ptr, size_t size, int DeviceId,
558b79dfb3SPushpinder Singh                              atmi_devtype_t DeviceType) {
568b79dfb3SPushpinder Singh   hsa_amd_memory_pool_t pool =
578b79dfb3SPushpinder Singh       get_memory_pool_by_mem_place(DeviceId, DeviceType);
58d0b31295SJon Chesterfield   hsa_status_t err = hsa_amd_memory_pool_allocate(pool, size, 0, ptr);
59d0b31295SJon Chesterfield   DEBUG_PRINT("Malloced [%s %d] %p\n",
608b79dfb3SPushpinder Singh               DeviceType == ATMI_DEVTYPE_CPU ? "CPU" : "GPU", DeviceId, *ptr);
6107f59baaSJon Chesterfield   return (err == HSA_STATUS_SUCCESS) ? HSA_STATUS_SUCCESS : HSA_STATUS_ERROR;
62d0b31295SJon Chesterfield }
63d0b31295SJon Chesterfield 
6407f59baaSJon Chesterfield hsa_status_t Runtime::Memfree(void *ptr) {
65d18fb09cSJon Chesterfield   hsa_status_t err = hsa_amd_memory_pool_free(ptr);
66d0b31295SJon Chesterfield   DEBUG_PRINT("Freed %p\n", ptr);
67d0b31295SJon Chesterfield 
6807f59baaSJon Chesterfield   return (err == HSA_STATUS_SUCCESS) ? HSA_STATUS_SUCCESS : HSA_STATUS_ERROR;
69d0b31295SJon Chesterfield }
70d0b31295SJon Chesterfield 
71d0b31295SJon Chesterfield } // namespace core
72