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