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 
initRPC()27 __attribute__((constructor(101))) void initRPC() {
28   DP("Init RPC library!\n");
29 
30   Manager = new RemoteClientManager();
31 }
32 
deinitRPC()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 
__tgt_rtl_register_lib(__tgt_bin_desc * Desc)44 int32_t __tgt_rtl_register_lib(__tgt_bin_desc *Desc) {
45   return Manager->registerLib(Desc);
46 }
47 
__tgt_rtl_unregister_lib(__tgt_bin_desc * Desc)48 int32_t __tgt_rtl_unregister_lib(__tgt_bin_desc *Desc) {
49   return Manager->unregisterLib(Desc);
50 }
51 
__tgt_rtl_is_valid_binary(__tgt_device_image * Image)52 int32_t __tgt_rtl_is_valid_binary(__tgt_device_image *Image) {
53   return Manager->isValidBinary(Image);
54 }
55 
__tgt_rtl_number_of_devices()56 int32_t __tgt_rtl_number_of_devices() { return Manager->getNumberOfDevices(); }
57 
__tgt_rtl_init_device(int32_t DeviceId)58 int32_t __tgt_rtl_init_device(int32_t DeviceId) {
59   return Manager->initDevice(DeviceId);
60 }
61 
__tgt_rtl_init_requires(int64_t RequiresFlags)62 int64_t __tgt_rtl_init_requires(int64_t RequiresFlags) {
63   return Manager->initRequires(RequiresFlags);
64 }
65 
__tgt_rtl_load_binary(int32_t DeviceId,__tgt_device_image * Image)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 
__tgt_rtl_is_data_exchangable(int32_t SrcDevId,int32_t DstDevId)71 int32_t __tgt_rtl_is_data_exchangable(int32_t SrcDevId, int32_t DstDevId) {
72   return Manager->isDataExchangeable(SrcDevId, DstDevId);
73 }
74 
__tgt_rtl_data_alloc(int32_t DeviceId,int64_t Size,void * HstPtr,int32_t Kind)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 
__tgt_rtl_data_submit(int32_t DeviceId,void * TgtPtr,void * HstPtr,int64_t Size)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 
__tgt_rtl_data_retrieve(int32_t DeviceId,void * HstPtr,void * TgtPtr,int64_t Size)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 
__tgt_rtl_data_delete(int32_t DeviceId,void * TgtPtr)96 int32_t __tgt_rtl_data_delete(int32_t DeviceId, void *TgtPtr) {
97   return Manager->dataDelete(DeviceId, TgtPtr);
98 }
99 
__tgt_rtl_data_exchange(int32_t SrcDevId,void * SrcPtr,int32_t DstDevId,void * DstPtr,int64_t Size)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 
__tgt_rtl_run_target_region(int32_t DeviceId,void * TgtEntryPtr,void ** TgtArgs,ptrdiff_t * TgtOffsets,int32_t ArgNum)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 
__tgt_rtl_run_target_team_region(int32_t DeviceId,void * TgtEntryPtr,void ** TgtArgs,ptrdiff_t * TgtOffsets,int32_t ArgNum,int32_t TeamNum,int32_t ThreadLimit,uint64_t LoopTripCount)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