///
/// Copyright (c) 2017-2023 Arm Limited.
///
/// SPDX-License-Identifier: MIT
///
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to
/// deal in the Software without restriction, including without limitation the
/// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
/// sell copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in all
/// copies or substantial portions of the Software.
///
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
/// SOFTWARE.
///
namespace arm_compute
{
/**
@mainpage Introduction
@copydoc introduction

@page introduction Introduction

@tableofcontents

The Compute Library is a collection of low-level machine learning functions optimized for both Arm CPUs and GPUs using SIMD technologies.

Several builds of the library are available using various configurations:
 - OS: Linux, Android, macOS or bare metal.
 - Architecture: armv7a (32bit) or armv8a (64bit).
 - Technology: Arm® Neon™ / OpenCL / Arm® Neon™ and OpenCL.
 - Debug / Asserts / Release: Use a build with asserts enabled to debug your application and enable extra validation. Once you are sure your application works as expected you can switch to a release build of the library for maximum performance.

@warning From 22.08 release, armv7a with Android build will no longer be tested or maintained.

@b Minimum toolchains requirements are shown below:

<table>
<tr>
  <th>Operating System
  <th>Architecture
  <th>Minimum Toolchain
<tr>
  <td rowspan="4">Linux
  <td>armv7a
  <td>gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf
  <tr>
  <td>armv8a
  <td rowspan="2">gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu
  <tr>
  <td>armv8.2-a
  <tr>
  <td>armv8.2-a-sve
  <td>gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
<tr>
  <td rowspan="2">Android
  <td>armv8a
  <td rowspan="2">NDK r20b
  <tr>
  <td>armv8.2-a
<tr>
  <td rowspan="1">macOS
  <td>armv8.2-a
  <td>Monterey (OS version): clang 13 (native)
</table>

@section S0_1_contact Contact / Support

Please create an issue on <a href="https://github.com/ARM-software/ComputeLibrary/issues">Github</a>.

In order to facilitate the work of the support team please provide the build information of the library you are using. To get the version of the library you are using simply run:

    $ strings android-armv8a-cl-asserts/libarm_compute.so | grep arm_compute_version
    arm_compute_version=v16.12 Build options: {'embed_kernels': '1', 'opencl': '1', 'arch': 'armv8a', 'neon': '0', 'asserts': '1', 'debug': '0', 'os': 'android', 'Werror': '1'} Git hash=f51a545d4ea12a9059fe4e598a092f1fd06dc858

@section S0_2_prebuilt_binaries Pre-built binaries

For each release we provide some pre-built binaries of the library [here](https://github.com/ARM-software/ComputeLibrary/releases).

These binaries have been built using the following toolchains:
            - Linux armv7a: gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabihf
            - Linux armv8a: gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu
            - Linux armv8.2-a: gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu
            - Linux armv8.2-a (multi-ISA binary): gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
            - Linux armv8.2-a-sve: gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
            - Android armv8a: clang++ / libc++ NDK r20b
            - Android armv8.2-a: clang++ / libc++ NDK r20b

@warning Make sure to use a compatible toolchain to build your application or you will get some std::bad_alloc errors at runtime.

@section S0_3_file_organisation File organisation

This archive contains:
 - The arm_compute header and source files
 - The latest Khronos OpenCL 1.2 C headers from the <a href="https://www.khronos.org/registry/cl/">Khronos OpenCL registry</a>
 - The latest Khronos cl2.hpp from the <a href="https://www.khronos.org/registry/cl/">Khronos OpenCL registry</a> (API version 2.1 when this document was written)
 - The latest Khronos EGL 1.5 C headers from the <a href="https://www.khronos.org/registry/gles/">Khronos EGL registry</a>
 - The sources for a stub version of libOpenCL.so, libGLESv1_CM.so, libGLESv2.so and libEGL.so to help you build your application.
 - An examples folder containing a few examples to compile and link against the library.
 - A utils folder containing headers with some boiler plate code used by the examples.
 - This documentation.

 For detailed information about file organization, please refer to Files -> File List section of this documentation.

*/
} // namespace arm_compute
