* ggml-virtgpu: regenerate_remoting.py: add the ability to deprecate a function * ggml-virtgpu: deprecate buffer_type is_host remoting not necessary * ggml-virtgpu: stop using static vars as cache The static init isn't thread safe. * ggml-virtgpu: protect the use of the shared memory to transfer data * ggml-virtgpu: make the remote calls thread-safe * ggml-virtgpu: backend: don't continue if couldn't allocate the tensor memory * ggml-virtgpu: add a cleanup function for consistency * ggml-virtgpu: backend: don't crash if buft->iface.get_max_size is missing * fix style and ordering * Remove the static variable in apir_device_get_count * ggml-virtgpu: improve the logging * fix review minor formatting changes
149 lines
3.9 KiB
C++
149 lines
3.9 KiB
C++
#include "backend-dispatched.h"
|
|
#include "backend-virgl-apir.h"
|
|
#include "ggml-backend-impl.h"
|
|
#include "ggml-backend.h"
|
|
#include "ggml-impl.h"
|
|
|
|
#include <cstdint>
|
|
|
|
uint32_t backend_device_get_device_count(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
int32_t dev_count = reg->iface.get_device_count(reg);
|
|
apir_encode_int32_t(enc, &dev_count);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_count(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
int32_t dev_count = reg->iface.get_device_count(reg);
|
|
apir_encode_int32_t(enc, &dev_count);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_name(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
const char * string = dev->iface.get_name(dev);
|
|
|
|
const size_t string_size = strlen(string) + 1;
|
|
apir_encode_array_size(enc, string_size);
|
|
apir_encode_char_array(enc, string, string_size);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_description(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
const char * string = dev->iface.get_description(dev);
|
|
|
|
const size_t string_size = strlen(string) + 1;
|
|
apir_encode_array_size(enc, string_size);
|
|
apir_encode_char_array(enc, string, string_size);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_type(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
uint32_t type = dev->iface.get_type(dev);
|
|
apir_encode_uint32_t(enc, &type);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_memory(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
size_t free, total;
|
|
dev->iface.get_memory(dev, &free, &total);
|
|
|
|
apir_encode_size_t(enc, &free);
|
|
apir_encode_size_t(enc, &total);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_supports_op(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
|
|
const ggml_tensor * op = apir_decode_ggml_tensor_inplace(dec);
|
|
|
|
bool supports_op = dev->iface.supports_op(dev, op);
|
|
|
|
apir_encode_bool_t(enc, &supports_op);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_buffer_type(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
ggml_backend_buffer_type_t bufft = dev->iface.get_buffer_type(dev);
|
|
|
|
apir_encode_ggml_buffer_type(enc, bufft);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_get_props(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
ggml_backend_dev_props props;
|
|
dev->iface.get_props(dev, &props);
|
|
|
|
apir_encode_bool_t(enc, &props.caps.async);
|
|
apir_encode_bool_t(enc, &props.caps.host_buffer);
|
|
apir_encode_bool_t(enc, &props.caps.buffer_from_host_ptr);
|
|
apir_encode_bool_t(enc, &props.caps.events);
|
|
|
|
return 0;
|
|
}
|
|
|
|
uint32_t backend_device_buffer_from_ptr(apir_encoder * enc, apir_decoder * dec, virgl_apir_context * ctx) {
|
|
GGML_UNUSED(ctx);
|
|
GGML_UNUSED(dec);
|
|
|
|
uint32_t shmem_res_id;
|
|
apir_decode_virtgpu_shmem_res_id(dec, &shmem_res_id);
|
|
|
|
void * shmem_ptr = ctx->iface->get_shmem_ptr(ctx->ctx_id, shmem_res_id);
|
|
if (!shmem_ptr) {
|
|
GGML_LOG_ERROR(GGML_VIRTGPU_BCK "%s: Couldn't get the shmem addr from virgl\n", __func__);
|
|
apir_decoder_set_fatal(dec);
|
|
return 1;
|
|
}
|
|
|
|
size_t size;
|
|
apir_decode_size_t(dec, &size);
|
|
size_t max_tensor_size;
|
|
apir_decode_size_t(dec, &max_tensor_size);
|
|
|
|
ggml_backend_buffer_t buffer;
|
|
buffer = dev->iface.buffer_from_host_ptr(dev, shmem_ptr, size, max_tensor_size);
|
|
|
|
apir_encode_ggml_buffer(enc, buffer);
|
|
apir_encode_ggml_buffer_type(enc, buffer->buft);
|
|
|
|
if (buffer) {
|
|
apir_track_backend_buffer(buffer);
|
|
}
|
|
|
|
return 0;
|
|
}
|