///
/// Copyright (c) 2017-2021 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 arm64-v8a (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.

@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>arm64-v8a
  <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="3">Android
  <td>armv7a
  <td rowspan="3">NDK r18b
  <tr>
  <td>arm64-v8a
  <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-armv7a-cl-asserts/libarm_compute.so | grep arm_compute_version
    arm_compute_version=v16.12 Build options: {'embed_kernels': '1', 'opencl': '1', 'arch': 'armv7a', '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 arm64-v8a: gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu
            - Linux arm64-v8.2-a: gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu
            - Linux arm64-v8.2-a (multi-ISA binary): gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
            - Linux armv8.2a-sve: gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu
            - Android armv7a: clang++ / libc++ NDK r20b
            - Android am64-v8a: clang++ / libc++ NDK r20b
            - Android arm64-v8.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
