Spaces:
Running on Zero
Running on Zero
| int apir_device_get_count(virtgpu * gpu) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_COUNT); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| int32_t dev_count = -1; | |
| apir_decode_int32_t(decoder, &dev_count); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return dev_count; | |
| } | |
| char * apir_device_get_name(virtgpu * gpu) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_NAME); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| const size_t string_size = apir_decode_array_size_unchecked(decoder); | |
| char * string = (char *) apir_decoder_alloc_array(sizeof(char), string_size); | |
| if (!string) { | |
| GGML_LOG_ERROR(GGML_VIRTGPU "%s: Could not allocate the device name buffer\n", __func__); | |
| return NULL; | |
| } | |
| apir_decode_char_array(decoder, string, string_size); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return string; | |
| } | |
| char * apir_device_get_description(virtgpu * gpu) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_DESCRIPTION); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| const size_t string_size = apir_decode_array_size_unchecked(decoder); | |
| char * string = (char *) apir_decoder_alloc_array(sizeof(char), string_size); | |
| if (!string) { | |
| GGML_LOG_ERROR(GGML_VIRTGPU "%s: Could not allocate the device description buffer\n", __func__); | |
| return NULL; | |
| } | |
| apir_decode_char_array(decoder, string, string_size); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return string; | |
| } | |
| uint32_t apir_device_get_type(virtgpu * gpu) { | |
| static uint32_t dev_type = 255; | |
| if (dev_type != 255) { | |
| return dev_type; | |
| } | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_TYPE); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| apir_decode_uint32_t(decoder, &dev_type); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return dev_type; | |
| } | |
| void apir_device_get_memory(virtgpu * gpu, size_t * free, size_t * total) { | |
| static size_t dev_free = 0; | |
| static size_t dev_total = 0; | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_MEMORY); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| apir_decode_size_t(decoder, &dev_free); | |
| apir_decode_size_t(decoder, &dev_total); | |
| *free = dev_free; | |
| *total = dev_total; | |
| remote_call_finish(gpu, encoder, decoder); | |
| return; | |
| } | |
| bool apir_device_supports_op(virtgpu * gpu, const ggml_tensor * op) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_SUPPORTS_OP); | |
| apir_encode_ggml_tensor_inline(encoder, op); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| bool supports_op; | |
| apir_decode_bool_t(decoder, &supports_op); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return supports_op; | |
| } | |
| apir_buffer_type_host_handle_t apir_device_get_buffer_type(virtgpu * gpu) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_BUFFER_TYPE); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| apir_buffer_type_host_handle_t buft_handle; | |
| apir_decode_apir_buffer_type_host_handle_t(decoder, &buft_handle); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return buft_handle; | |
| } | |
| void apir_device_get_props(virtgpu * gpu, | |
| bool * async, | |
| bool * host_buffer, | |
| bool * buffer_from_host_ptr, | |
| bool * events) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_GET_PROPS); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| apir_decode_bool_t(decoder, async); | |
| apir_decode_bool_t(decoder, host_buffer); | |
| apir_decode_bool_t(decoder, buffer_from_host_ptr); | |
| apir_decode_bool_t(decoder, events); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return; | |
| } | |
| apir_buffer_context_t apir_device_buffer_from_ptr(virtgpu * gpu, size_t size, size_t max_tensor_size) { | |
| apir_encoder * encoder; | |
| apir_decoder * decoder; | |
| ApirForwardReturnCode ret; | |
| apir_buffer_context_t buffer_context; | |
| REMOTE_CALL_PREPARE(gpu, encoder, APIR_COMMAND_TYPE_DEVICE_BUFFER_FROM_PTR); | |
| if (virtgpu_shmem_create(gpu, size, &buffer_context.shmem)) { | |
| GGML_ABORT(GGML_VIRTGPU "%s: Couldn't allocate %ldb of guest-host shared buffer", __func__, size); | |
| } | |
| apir_encode_virtgpu_shmem_res_id(encoder, buffer_context.shmem.res_id); | |
| apir_encode_size_t(encoder, &size); | |
| apir_encode_size_t(encoder, &max_tensor_size); | |
| REMOTE_CALL(gpu, encoder, decoder, ret); | |
| apir_decode_apir_buffer_host_handle_t(decoder, &buffer_context.host_handle); | |
| buffer_context.buft_host_handle = apir_decode_apir_buffer_type_host_handle(decoder); | |
| remote_call_finish(gpu, encoder, decoder); | |
| return buffer_context; | |
| } | |