1 //===-------------------------- Server.h - Server -------------------------===//
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 // Offloading gRPC server for remote host.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_OPENMP_LIBOMPTARGET_PLUGINS_REMOTE_SERVER_SERVER_H
14 #define LLVM_OPENMP_LIBOMPTARGET_PLUGINS_REMOTE_SERVER_SERVER_H
15 
16 #include <grpcpp/server_context.h>
17 
18 #include "Utils.h"
19 #include "device.h"
20 #include "omptarget.h"
21 #include "openmp.grpc.pb.h"
22 #include "openmp.pb.h"
23 #include "rtl.h"
24 
25 using grpc::ServerContext;
26 using grpc::ServerReader;
27 using grpc::ServerWriter;
28 using grpc::Status;
29 
30 using namespace openmp::libomptarget::remote;
31 using namespace RemoteOffloading;
32 
33 using namespace google;
34 
35 extern PluginManager *PM;
36 
37 class RemoteOffloadImpl final : public RemoteOffload::Service {
38 private:
39   int32_t mapHostRTLDeviceId(int32_t RTLDeviceID);
40 
41   std::unordered_map<const void *, __tgt_device_image *>
42       HostToRemoteDeviceImage;
43   std::unordered_map<const void *, std::unique_ptr<__tgt_bin_desc>>
44       Descriptions;
45   __tgt_target_table *Table = nullptr;
46 
47   int DebugLevel;
48   uint64_t MaxSize;
49   uint64_t BlockSize;
50   std::unique_ptr<protobuf::Arena> Arena;
51 
52 public:
RemoteOffloadImpl(uint64_t MaxSize,uint64_t BlockSize)53   RemoteOffloadImpl(uint64_t MaxSize, uint64_t BlockSize)
54       : MaxSize(MaxSize), BlockSize(BlockSize) {
55     DebugLevel = getDebugLevel();
56     Arena = std::make_unique<protobuf::Arena>();
57   }
58 
59   Status Shutdown(ServerContext *Context, const Null *Request,
60                   I32 *Reply) override;
61 
62   Status RegisterLib(ServerContext *Context,
63                      const TargetBinaryDescription *Description,
64                      I32 *Reply) override;
65   Status UnregisterLib(ServerContext *Context, const Pointer *Request,
66                        I32 *Reply) override;
67 
68   Status IsValidBinary(ServerContext *Context,
69                        const TargetDeviceImagePtr *Image,
70                        I32 *IsValid) override;
71   Status GetNumberOfDevices(ServerContext *Context, const Null *Null,
72                             I32 *NumberOfDevices) override;
73 
74   Status InitDevice(ServerContext *Context, const I32 *DeviceNum,
75                     I32 *Reply) override;
76   Status InitRequires(ServerContext *Context, const I64 *RequiresFlag,
77                       I32 *Reply) override;
78 
79   Status LoadBinary(ServerContext *Context, const Binary *Binary,
80                     TargetTable *Reply) override;
81   Status IsDataExchangeable(ServerContext *Context, const DevicePair *Request,
82                             I32 *Reply) override;
83 
84   Status DataAlloc(ServerContext *Context, const AllocData *Request,
85                    Pointer *Reply) override;
86 
87   Status DataSubmit(ServerContext *Context, ServerReader<SubmitData> *Reader,
88                     I32 *Reply) override;
89   Status DataRetrieve(ServerContext *Context, const RetrieveData *Request,
90                       ServerWriter<Data> *Writer) override;
91 
92   Status DataExchange(ServerContext *Context, const ExchangeData *Request,
93                       I32 *Reply) override;
94 
95   Status DataDelete(ServerContext *Context, const DeleteData *Request,
96                     I32 *Reply) override;
97 
98   Status RunTargetRegion(ServerContext *Context, const TargetRegion *Request,
99                          I32 *Reply) override;
100 
101   Status RunTargetTeamRegion(ServerContext *Context,
102                              const TargetTeamRegion *Request,
103                              I32 *Reply) override;
104 };
105 
106 #endif
107