1#include "ggml-remoting.h"
 2#include "../../include/ggml-virtgpu.h"
 3
 4static const char * ggml_backend_remoting_get_name(ggml_backend_t backend) {
 5    UNUSED(backend);
 6
 7    return "API Remoting backend";
 8}
 9
10static void ggml_backend_remoting_free(ggml_backend_t backend) {
11    delete backend;
12}
13
14static ggml_status ggml_backend_remoting_graph_compute(ggml_backend_t backend, ggml_cgraph * cgraph) {
15    virtgpu * gpu = DEV_TO_GPU(backend->device);
16
17    return apir_backend_graph_compute(gpu, cgraph);
18}
19
20static void ggml_backend_remoting_graph_optimize(ggml_backend_t backend, ggml_cgraph * cgraph) {
21    virtgpu * gpu = DEV_TO_GPU(backend->device);
22#if true
23    UNUSED(gpu);
24    UNUSED(cgraph);
25#else
26    // not working yet
27
28    apir_backend_graph_optimize(gpu, cgraph);
29#endif
30}
31
32static ggml_backend_i ggml_backend_remoting_interface = {
33    /* .get_name                = */ ggml_backend_remoting_get_name,
34    /* .free                    = */ ggml_backend_remoting_free,
35    /* .set_tensor_async        = */ NULL,  // ggml_backend_remoting_set_tensor_async,
36    /* .get_tensor_async        = */ NULL,  // ggml_backend_remoting_get_tensor_async,
37    /* .cpy_tensor_async        = */ NULL,  // ggml_backend_remoting_cpy_tensor_async,
38    /* .synchronize             = */ NULL,  // ggml_backend_remoting_synchronize,
39    /* .graph_plan_create       = */ NULL,
40    /* .graph_plan_free         = */ NULL,
41    /* .graph_plan_update       = */ NULL,
42    /* .graph_plan_compute      = */ NULL,
43    /* .graph_compute           = */ ggml_backend_remoting_graph_compute,
44    /* .event_record            = */ NULL,
45    /* .event_wait              = */ NULL,
46    /* .graph_optimize          = */ ggml_backend_remoting_graph_optimize,
47};
48
49static ggml_guid_t ggml_backend_remoting_guid() {
50    static ggml_guid guid = { 0xb8, 0xf7, 0x4f, 0x86, 0x14, 0x03, 0x86, 0x02,
51                              0x91, 0xc8, 0xdd, 0xe9, 0x02, 0x3f, 0xc0, 0x2b };
52
53    return &guid;
54}
55
56ggml_backend_t ggml_backend_remoting_device_init(ggml_backend_dev_t dev, const char * params) {
57    UNUSED(params);
58
59    ggml_backend_remoting_device_context * ctx = (ggml_backend_remoting_device_context *) dev->context;
60
61    ggml_backend_t remoting_backend = new ggml_backend{
62        /* .guid      = */ ggml_backend_remoting_guid(),
63        /* .interface = */ ggml_backend_remoting_interface,
64        /* .device    = */ ggml_backend_reg_dev_get(ggml_backend_virtgpu_reg(), ctx->device),
65        /* .context   = */ ctx,
66    };
67
68    return remoting_backend;
69}