| // Copyright (c) Facebook, Inc. and its affiliates. |
| // All rights reserved. |
| // |
| // Copyright 2019 Google LLC |
| // |
| // This source code is licensed under the BSD-style license found in the |
| // LICENSE file in the root directory of this source tree. |
| |
| #include <stdbool.h> |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <string.h> |
| |
| #ifdef _WIN32 |
| #include <windows.h> |
| #else |
| #include <unistd.h> |
| #endif |
| |
| #ifdef _MSC_VER |
| #include <intrin.h> |
| #endif |
| |
| #include "include/xnnpack.h" |
| #include "src/xnnpack/allocator.h" |
| #include "src/xnnpack/hardware-config.h" |
| #include "src/xnnpack/init-once.h" |
| #include "src/xnnpack/log.h" |
| #include "src/xnnpack/params.h" |
| |
| #if XNN_ENABLE_KLEIDIAI |
| #include <stdio.h> |
| |
| #include "kai/kai_common.h" |
| #endif // XNN_ENABLE_KLEIDIAI |
| |
| XNN_INIT_ONCE_GUARD(allocator); |
| |
| static const struct xnn_allocator* volatile init_allocator = NULL; |
| |
| static void init_allocator_config(void) { |
| uint32_t init_flags = XNN_INIT_FLAG_XNNPACK; |
| memcpy(&xnn_params.allocator, init_allocator, sizeof(struct xnn_allocator)); |
| xnn_params.init_flags = init_flags; |
| } |
| |
| enum xnn_status xnn_initialize(const struct xnn_allocator* allocator) { |
| const struct xnn_hardware_config* hardware_config = xnn_init_hardware_config(); |
| if (hardware_config == NULL) { |
| xnn_log_error("XNNPACK initialization failed: hardware not supported"); |
| return xnn_status_unsupported_hardware; |
| } |
| |
| if (allocator == NULL) { |
| allocator = &xnn_default_allocator; |
| } |
| #ifdef _MSC_VER |
| _InterlockedCompareExchangePointer((PVOID volatile*) &init_allocator, (PVOID) allocator, NULL); |
| #else |
| __sync_bool_compare_and_swap(&init_allocator, NULL, allocator); |
| #endif |
| XNN_INIT_ONCE(allocator); |
| if ((xnn_params.init_flags & XNN_INIT_FLAG_XNNPACK) != 0) { |
| return xnn_status_success; |
| } else { |
| return xnn_status_unsupported_hardware; |
| } |
| |
| #if XNN_ENABLE_KLEIDIAI |
| /* If we're using KleidiAI, log their version string. */ |
| static bool first = true; |
| if (first) { |
| first = false; |
| fprintf(stderr, |
| "XNNPACK built with KleidiAI v%s (see " |
| "https://gitlab.arm.com/kleidi/kleidiai).\n", |
| kai_get_version()); |
| } |
| #endif // XNN_ENABLE_KLEIDIAI |
| } |
| |
| enum xnn_status xnn_deinitialize(void) { |
| return xnn_status_success; |
| } |