1 //===--------------------- rtl.cpp - Remote RTL Plugin --------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // RTL for Host. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include <cstddef> 14 #include <memory> 15 #include <string> 16 17 #include "Client.h" 18 #include "Utils.h" 19 #include "omptarget.h" 20 #include "omptargetplugin.h" 21 22 #define TARGET_NAME RPC 23 #define DEBUG_PREFIX "Target " GETNAME(TARGET_NAME) " RTL" 24 25 RemoteClientManager *Manager; 26 27 __attribute__((constructor(101))) void initRPC() { 28 DP("Init RPC library!\n"); 29 30 Manager = new RemoteClientManager(); 31 } 32 33 __attribute__((destructor(101))) void deinitRPC() { 34 Manager->shutdown(); // TODO: Error handle shutting down 35 DP("Deinit RPC library!\n"); 36 delete Manager; 37 } 38 39 // Exposed library API function 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 int32_t __tgt_rtl_register_lib(__tgt_bin_desc *Desc) { 45 return Manager->registerLib(Desc); 46 } 47 48 int32_t __tgt_rtl_unregister_lib(__tgt_bin_desc *Desc) { 49 return Manager->unregisterLib(Desc); 50 } 51 52 int32_t __tgt_rtl_is_valid_binary(__tgt_device_image *Image) { 53 return Manager->isValidBinary(Image); 54 } 55 56 int32_t __tgt_rtl_number_of_devices() { return Manager->getNumberOfDevices(); } 57 58 int32_t __tgt_rtl_init_device(int32_t DeviceId) { 59 return Manager->initDevice(DeviceId); 60 } 61 62 int64_t __tgt_rtl_init_requires(int64_t RequiresFlags) { 63 return Manager->initRequires(RequiresFlags); 64 } 65 66 __tgt_target_table *__tgt_rtl_load_binary(int32_t DeviceId, 67 __tgt_device_image *Image) { 68 return Manager->loadBinary(DeviceId, (__tgt_device_image *)Image); 69 } 70 71 int32_t __tgt_rtl_is_data_exchangable(int32_t SrcDevId, int32_t DstDevId) { 72 return Manager->isDataExchangeable(SrcDevId, DstDevId); 73 } 74 75 void *__tgt_rtl_data_alloc(int32_t DeviceId, int64_t Size, void *HstPtr, 76 int32_t Kind) { 77 if (Kind != TARGET_ALLOC_DEFAULT) { 78 REPORT("Invalid target data allocation kind or requested allocator not " 79 "implemented yet\n"); 80 return NULL; 81 } 82 83 return Manager->dataAlloc(DeviceId, Size, HstPtr); 84 } 85 86 int32_t __tgt_rtl_data_submit(int32_t DeviceId, void *TgtPtr, void *HstPtr, 87 int64_t Size) { 88 return Manager->dataSubmit(DeviceId, TgtPtr, HstPtr, Size); 89 } 90 91 int32_t __tgt_rtl_data_retrieve(int32_t DeviceId, void *HstPtr, void *TgtPtr, 92 int64_t Size) { 93 return Manager->dataRetrieve(DeviceId, HstPtr, TgtPtr, Size); 94 } 95 96 int32_t __tgt_rtl_data_delete(int32_t DeviceId, void *TgtPtr) { 97 return Manager->dataDelete(DeviceId, TgtPtr); 98 } 99 100 int32_t __tgt_rtl_data_exchange(int32_t SrcDevId, void *SrcPtr, 101 int32_t DstDevId, void *DstPtr, int64_t Size) { 102 return Manager->dataExchange(SrcDevId, SrcPtr, DstDevId, DstPtr, Size); 103 } 104 105 106 int32_t __tgt_rtl_run_target_region(int32_t DeviceId, void *TgtEntryPtr, 107 void **TgtArgs, ptrdiff_t *TgtOffsets, 108 int32_t ArgNum) { 109 return Manager->runTargetRegion(DeviceId, TgtEntryPtr, TgtArgs, TgtOffsets, 110 ArgNum); 111 } 112 113 int32_t __tgt_rtl_run_target_team_region(int32_t DeviceId, void *TgtEntryPtr, 114 void **TgtArgs, ptrdiff_t *TgtOffsets, 115 int32_t ArgNum, int32_t TeamNum, 116 int32_t ThreadLimit, 117 uint64_t LoopTripCount) { 118 return Manager->runTargetTeamRegion(DeviceId, TgtEntryPtr, TgtArgs, 119 TgtOffsets, ArgNum, TeamNum, ThreadLimit, 120 LoopTripCount); 121 } 122 123 // Exposed library API function 124 #ifdef __cplusplus 125 } 126 #endif 127