1#pragma once
 2#include "ggml-backend-impl.h"
 3#include "ggml-cpu-impl.h"
 4#include "ggml.h"
 5
 6#ifdef __cplusplus
 7#    include <vector>
 8extern "C" {
 9#endif
10
11// return true if op part of extra "accelerator"
12bool ggml_cpu_extra_compute_forward(struct ggml_compute_params * params, struct ggml_tensor * op);
13bool ggml_cpu_extra_work_size(int n_threads, const struct ggml_tensor * op, size_t * size);
14
15#ifdef __cplusplus
16}
17
18namespace ggml::cpu {
19// register in tensor->extra
20class tensor_traits {
21  public:
22    virtual ~tensor_traits();
23    virtual bool work_size(int n_threads, const struct ggml_tensor * op, size_t & size)        = 0;
24    virtual bool compute_forward(struct ggml_compute_params * params, struct ggml_tensor * op) = 0;
25};
26
27class extra_buffer_type {
28  public:
29    virtual ~extra_buffer_type();
30    virtual bool            supports_op(ggml_backend_dev_t dev, const struct ggml_tensor * op) = 0;
31    virtual tensor_traits * get_tensor_traits(const struct ggml_tensor * op)                   = 0;
32};
33}  // namespace ggml::cpu
34
35// implemented in ggml-cpu.cpp.
36std::vector<ggml_backend_buffer_type_t> & ggml_backend_cpu_get_extra_buffer_types();
37
38#endif