Oakfield API Documentation 1.0.0
Numerical core APIs
Loading...
Searching...
No Matches
backend.h
Go to the documentation of this file.
1
16#ifndef OAKFIELD_BACKEND_H
17#define OAKFIELD_BACKEND_H
18
19#include <stdbool.h>
20#include <stddef.h>
21#include <stdint.h>
22
23#include "oakfield/field.h"
24#include "oakfield/kernel_ir.h"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
38
51
59typedef struct SimKernelIRBinding {
60 size_t field_index;
62 const size_t* shape;
63 const size_t* strides;
64 size_t rank;
66
77
89
108
121
133
143void backend_launch(SimBackend* backend, KernelIR* kernel);
144
154
163
172void sim_backend_cpu_set_vdsp_enabled(SimBackend* backend, bool enabled);
173
174#ifdef SIM_TESTING
186sim_backend_metal_debug_copy_device_name(SimBackend* backend, char* out_name, size_t capacity);
187
195SimResult sim_backend_metal_debug_get_pipeline_cache_count(SimBackend* backend, size_t* out_count);
196
204SimResult sim_backend_metal_debug_get_total_pipeline_refcount(SimBackend* backend,
205 size_t* out_total);
206#endif
207
215static inline bool backend_supports_features(const SimBackend* backend, uint64_t mask) {
216 if (backend == NULL) {
217 return false;
218 }
219 return (backend->features & mask) == mask;
220}
221
229static inline bool backend_supports_feature(const SimBackend* backend, SimBackendFeature feature) {
230 return backend_supports_features(backend, (uint64_t) feature);
231}
232
239static inline void backend_enable_feature(SimBackend* backend, SimBackendFeature feature) {
240 if (backend == NULL) {
241 return;
242 }
243 backend->features |= (uint64_t) feature;
244}
245
252static inline void backend_disable_feature(SimBackend* backend, SimBackendFeature feature) {
253 if (backend == NULL) {
254 return;
255 }
256 backend->features &= ~((uint64_t) feature);
257}
258
265static inline void backend_set_features(SimBackend* backend, uint64_t mask) {
266 if (backend == NULL) {
267 return;
268 }
269 backend->features = mask;
270}
271
278static inline size_t sim_kernel_binding_width(const SimKernelIRBinding* binding) {
279 if (binding == NULL || binding->shape == NULL || binding->rank == 0U) {
280 return 0U;
281 }
282 return binding->shape[binding->rank - 1U];
283}
284
293static inline size_t sim_kernel_binding_height(const SimKernelIRBinding* binding) {
294 if (binding == NULL || binding->shape == NULL || binding->rank == 0U) {
295 return 0U;
296 }
297 if (binding->rank == 1U) {
298 return 1U;
299 }
300 return binding->shape[binding->rank - 2U];
301}
302
316static inline SimResult sim_kernel_binding_index_to_xy(const SimKernelIRBinding* binding,
317 size_t index,
318 size_t* out_x,
319 size_t* out_y) {
320 if (binding == NULL || out_x == NULL || out_y == NULL) {
322 }
323
324 const size_t* shape = binding->shape;
325 const size_t* strides = binding->strides;
326 size_t rank = binding->rank;
327 if ((shape == NULL || strides == NULL || rank == 0U) && binding->field != NULL) {
328 shape = binding->field->layout.shape;
329 strides = binding->field->layout.strides;
330 rank = binding->field->layout.rank;
331 }
332
333 if (shape == NULL || strides == NULL || rank == 0U) {
335 }
336
337 size_t count = 1U;
338 for (size_t i = 0U; i < rank; ++i) {
339 if (shape[i] == 0U) {
341 }
342 count *= shape[i];
343 }
344 if (index >= count) {
346 }
347
348 if (rank == 1U) {
349 *out_x = index;
350 *out_y = 0U;
351 return SIM_RESULT_OK;
352 }
353
354 size_t axis_x = rank - 1U;
355 size_t axis_y = rank - 2U;
356 size_t extent_x = shape[axis_x];
357 size_t extent_y = shape[axis_y];
358 size_t stride_x = strides[axis_x];
359 size_t stride_y = strides[axis_y];
360 if (extent_x == 0U || extent_y == 0U || stride_x == 0U || stride_y == 0U) {
362 }
363
364 *out_x = (index / stride_x) % extent_x;
365 *out_y = (index / stride_y) % extent_y;
366 return SIM_RESULT_OK;
367}
368
369#ifdef __cplusplus
370}
371#endif
372
373#endif /* OAKFIELD_BACKEND_H */
SimBackendType
Identifies the concrete backend implementation in use.
Definition backend.h:33
@ SIM_BACKEND_TYPE_CPU
Definition backend.h:34
@ SIM_BACKEND_TYPE_METAL
Definition backend.h:36
@ SIM_BACKEND_TYPE_CUDA
Definition backend.h:35
void backend_init(SimBackend *backend)
Initialize a backend instance.
SimKernelComplexSemantics
Declares how complex-valued IR lanes should be interpreted by backends.
Definition backend.h:85
@ SIM_KERNEL_COMPLEX_SEMANTICS_TRUE_COMPLEX
Definition backend.h:86
@ SIM_KERNEL_COMPLEX_SEMANTICS_COMPONENTWISE
Definition backend.h:87
bool sim_backend_cpu_vdsp_enabled(const SimBackend *backend)
Query whether the CPU backend currently uses vDSP fast paths.
void backend_destroy(SimBackend *backend)
Tear down a backend instance and release owned resources.
SimBackendFeature
Compute backend feature flags indicating supported capabilities.
Definition backend.h:46
@ SIM_BACKEND_FEATURE_BOUNDARY_AWARE_DIFFS
Definition backend.h:49
@ SIM_BACKEND_FEATURE_ANALYTIC_WARP
Definition backend.h:48
@ SIM_BACKEND_FEATURE_NONE
Definition backend.h:47
void sim_backend_cpu_set_vdsp_enabled(SimBackend *backend, bool enabled)
Enable or disable vDSP fast paths on the CPU backend at runtime.
void backend_launch(SimBackend *backend, KernelIR *kernel)
Launch a kernel on the selected backend implementation.
Multidimensional contiguous field abstraction with configurable layout.
SimResult
Return codes shared by libsimcore modules.
Definition field.h:29
@ SIM_RESULT_OK
Definition field.h:30
@ SIM_RESULT_INVALID_ARGUMENT
Definition field.h:31
Intermediate representation facilities for libsimcore operator fusion.
size_t SimIRNodeId
Definition kernel_ir.h:28
KernelIR package describing the executable graph for a backend.
Definition backend.h:97
size_t output_count
Definition backend.h:102
const SimKernelIRBinding * bindings
Definition backend.h:99
uint64_t required_features
Definition backend.h:105
size_t param_count
Definition backend.h:104
const SimKernelIROutput * outputs
Definition backend.h:101
size_t binding_count
Definition backend.h:100
const SimIRBuilder * builder
Definition backend.h:98
double * params
Definition backend.h:103
SimKernelComplexSemantics complex_semantics
Definition backend.h:106
Runtime backend handle shared across implementations.
Definition backend.h:115
SimBackendType type
Definition backend.h:116
SimResult last_error
Definition backend.h:117
uint64_t features
Definition backend.h:118
void * impl
Definition backend.h:119
size_t * strides
Definition field.h:150
size_t * shape
Definition field.h:149
size_t rank
Definition field.h:148
Owning multidimensional field.
Definition field.h:157
SimFieldLayout layout
Definition field.h:158
Monotonic arena for IR node allocation.
Definition kernel_ir.h:347
Field binding made available to a compiled kernel.
Definition backend.h:59
const size_t * shape
Definition backend.h:62
size_t rank
Definition backend.h:64
size_t field_index
Definition backend.h:60
const size_t * strides
Definition backend.h:63
SimField * field
Definition backend.h:61
Output specification emitted by a kernel.
Definition backend.h:73
size_t field_index
Definition backend.h:74
SimIRNodeId expression
Definition backend.h:75