[llvm] [Offload][Conformance] Add README file (PR #155190)

Leandro Lacerda via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 25 09:47:38 PDT 2025


https://github.com/leandrolcampos updated https://github.com/llvm/llvm-project/pull/155190

>From 12100ac2b6f79134a347fd94f84b149187ba8594 Mon Sep 17 00:00:00 2001
From: Leandro Augusto Lacerda Campos <leandrolcampos at yahoo.com.br>
Date: Sun, 24 Aug 2025 16:35:54 -0300
Subject: [PATCH] Add README file

---
 offload/unittests/Conformance/README.md | 810 ++++++++++++++++++++++++
 1 file changed, 810 insertions(+)
 create mode 100644 offload/unittests/Conformance/README.md

diff --git a/offload/unittests/Conformance/README.md b/offload/unittests/Conformance/README.md
new file mode 100644
index 0000000000000..91010b420cf96
--- /dev/null
+++ b/offload/unittests/Conformance/README.md
@@ -0,0 +1,810 @@
+# GPU Math Conformance Tests
+
+## Overview
+
+This test suite provides a framework to systematically measure the accuracy of math functions on GPUs and verify their conformance with standards like OpenCL.
+
+While the primary focus is validating the implementations in the C standard math library (LLVM-libm), these tests can also be executed against other math library providers, such as CUDA Math and HIP Math, for comparison.
+
+The goals of this project are to empower LLVM-libm contributors with a robust tool for validating their implementations and to build trust with end-users by providing transparent accuracy data.
+
+### Table of Contents
+
+- [Getting Started](#getting-started)
+- [Running the Tests](#running-the-tests)
+- [Test Results](#test-results)
+- [Adding New Tests](#adding-new-tests)
+- [Architecture Overview](#architecture-overview)
+
+## Getting Started
+
+This guide covers how to build the necessary dependencies, which include the new Offload API and the C standard library for both host and GPU targets.
+
+### System Requirements
+
+Before you begin, ensure your system meets the following requirements:
+
+* A system with an AMD or NVIDIA GPU.
+* The latest proprietary GPU drivers installed.
+* The corresponding development SDK for your hardware:
+    * **AMD:** [ROCm SDK](https://rocm.docs.amd.com)
+    * **NVIDIA:** [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)
+
+
+### 1. Check out the LLVM project
+
+First, clone the LLVM project repository. For users who only need to build and run the tests, a shallow clone is sufficient and much faster.
+
+```bash
+git clone --depth=1 https://github.com/llvm/llvm-project.git
+```
+
+### 2. Configure the Build
+
+The recommended way to build the dependencies is to use the LLVM runtimes support. This approach automatically handles bootstrapping an up-to-date `clang` compiler and then uses it to build the `offload` and `libc` components.
+
+First, define an environment variable, `$LLVM_HOME`, to specify the desired installation directory for the toolchain and libraries.
+
+```bash
+export LLVM_HOME=/path/to/your/llvm/install
+```
+
+The command below provides an example configuration for a `Release` build. It specifically instructs the build system to compile `libc` for three distinct targets: the native host (`default`), AMD GPUs (`amdgcn-amd-amdhsa`), and NVIDIA GPUs (`nvptx64-nvidia-cuda`). You can customize options like `-DCMAKE_BUILD_TYPE` as needed.
+
+Execute this command from the root of the `llvm-project` directory:
+
+```bash
+cmake -S llvm -B build -G Ninja \
+  -DLLVM_ENABLE_PROJECTS="clang;lld" \
+  -DLLVM_ENABLE_RUNTIMES="openmp;offload;libc" \
+  -DCMAKE_BUILD_TYPE=Release \
+  -DLLVM_ENABLE_ASSERTIONS=ON \
+  -DLLVM_PARALLEL_LINK_JOBS=1 \
+  -DCMAKE_INSTALL_PREFIX="$LLVM_HOME" \
+  -DRUNTIMES_amdgcn-amd-amdhsa_LLVM_ENABLE_RUNTIMES=libc \
+  -DRUNTIMES_nvptx64-nvidia-cuda_LLVM_ENABLE_RUNTIMES=libc \
+  -DLLVM_RUNTIME_TARGETS="default;amdgcn-amd-amdhsa;nvptx64-nvidia-cuda"
+```
+
+### 3. Build and Install
+
+After configuring the build, compile and install the necessary dependencies using Ninja.
+
+```bash
+ninja -C build install -j8
+```
+
+> [!NOTE]
+> Running Ninja with high parallelism can cause spurious failures, out-of-resource errors, or indefinite hangs. Limit the number of jobs with `-j<N>` if you hit such issues.
+
+## Running the Tests
+
+### Default Test
+
+To build and run the conformance test for a given function (e.g., `logf`) against the default C standard math library `llvm-libm` provider, use the following command. This will execute the test on all available and supported platforms.
+
+```bash
+ninja -C build/runtimes/runtimes-bins offload.conformance.logf
+```
+
+### Testing Other Providers
+
+Once the test binary has been built, you can run it against other math library providers using the `--test-configs` flag.
+
+* **For `cuda-math` on an NVIDIA GPU:**
+
+  ```bash
+  ./build/runtimes/runtimes-bins/offload/logf.conformance --test-configs=cuda-math:cuda
+  ```
+
+* **For `hip-math` on an AMD GPU:**
+
+  ```bash
+  ./build/runtimes/runtimes-bins/offload/logf.conformance --test-configs=hip-math:amdgpu
+  ```
+
+You can also run all available configurations for a test with:
+
+```bash
+./build/runtimes/runtimes-bins/offload/logf.conformance --test-configs=all
+```
+
+## Test Results
+
+The results from the GPU are validated against reference values computed on the host CPU. These references are generated by the host's LLVM-libm, and the comparison is done by measuring the ULP (Units in the Last Place) distance. The pass/fail tolerances are typically based on the OpenCL C specification.
+
+All tests assume the host machine operates in the default floating-point environment with the round-to-nearest-even rounding mode.
+
+The results are generated using two distinct methodologies, chosen based on the size of the function's input space:
+
+* **Exhaustive Testing**: This method iterates over every representable point in the input space. It is used for half-precision functions and single-precision univariate functions, ensuring complete coverage of the input space.
+
+* **Randomized Testing**: This method is used for functions with larger input spaces, such as single-precision bivariate and double-precision functions, where exhaustive testing is computationally infeasible. Although not exhaustive, the tests are deterministic, using a fixed seed to sample a large, reproducible subset of points from the input space. The specific seed and sample size are configured in each test's source file, typically using 2<sup>32</sup> samples.
+
+---
+
+The following tables show the maximum observed ULP distance for each function compared against its host-side reference.
+
+### Exhaustive Test Results for Half-Precision Math Functions
+
+<table style="table-layout: fixed;">
+  <thead>
+    <tr>
+      <th rowspan="2" style="text-align: left; width: 150px;">Function</th>
+      <th rowspan="2" style="text-align: center;">ULP Tolerance</th>
+      <th colspan="4" style="text-align: center;">Max ULP Distance</th>
+    </tr>
+    <tr>
+      <th style="text-align: center;">llvm-libm<br>(AMDGPU)</th>
+      <th style="text-align: center;">llvm-libm<br>(CUDA)</th>
+      <th style="text-align: center;">cuda-math<br>(CUDA)</th>
+      <th style="text-align: center;">hip-math<br>(AMDGPU)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: left;">acosf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">acoshf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">0</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">acospif16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;"></td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">asinf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">asinhf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">atanf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">atanhf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cosf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">coshf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cospif16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;"></td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">expf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp10f16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp2f16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">0</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">expm1f16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">hypotf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;"></td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">logf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log10f16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log2f16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">0</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sinf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sinhf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sinpif16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;"></td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tanf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tanhf16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tanpif16</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;"></td>
+    </tr>
+  </tbody>
+</table>
+
+### Exhaustive Test Results for Single-Precision Univariate Math Functions
+
+<table style="table-layout: fixed;">
+  <thead>
+    <tr>
+      <th rowspan="2" style="text-align: left; width: 150px;">Function</th>
+      <th rowspan="2" style="text-align: center;">ULP Tolerance</th>
+      <th colspan="4" style="text-align: center;">Max ULP Distance</th>
+    </tr>
+    <tr>
+      <th style="text-align: center;">llvm-libm<br>(AMDGPU)</th>
+      <th style="text-align: center;">llvm-libm<br>(CUDA)</th>
+      <th style="text-align: center;">cuda-math<br>(CUDA)</th>
+      <th style="text-align: center;">hip-math<br>(AMDGPU)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: left;">acosf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">acoshf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">asinf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">3</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">asinhf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">atanf</td>
+      <td style="text-align: center;">5</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">atanhf</td>
+      <td style="text-align: center;">5</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cbrtf</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cosf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">coshf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cospif</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">erff</td>
+      <td style="text-align: center;">16</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">expf</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp10f</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp2f</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">expm1f</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">logf</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log10f</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log1pf</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log2f</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sinf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sincosf (sin part)</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sincosf (cos part)</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sinhf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sinpif</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tanf</td>
+      <td style="text-align: center;">5</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tanhf</td>
+      <td style="text-align: center;">5</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tanpif</td>
+      <td style="text-align: center;">6</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;"></td>
+      <td style="text-align: center;"></td>
+    </tr>
+  </tbody>
+</table>
+
+### Randomized Test Results for Single-Precision Bivariate Math Functions
+
+<table style="table-layout: fixed;">
+  <thead>
+    <tr>
+      <th rowspan="2" style="text-align: left; width: 150px;">Function</th>
+      <th rowspan="2" style="text-align: center;">ULP Tolerance</th>
+      <th colspan="4" style="text-align: center;">Max ULP Distance</th>
+    </tr>
+    <tr>
+      <th style="text-align: center;">llvm-libm<br>(AMDGPU)</th>
+      <th style="text-align: center;">llvm-libm<br>(CUDA)</th>
+      <th style="text-align: center;">cuda-math<br>(CUDA)</th>
+      <th style="text-align: center;">hip-math<br>(AMDGPU)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: left;">atan2f</td>
+      <td style="text-align: center;">6</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">3</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">hypotf</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">powf<br>(integer exponents)</td>
+      <td style="text-align: center;">16</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">powf<br>(real exponents)</td>
+      <td style="text-align: center;">16</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+  </tbody>
+</table>
+
+### Randomized Test Results for Double-Precision Math Functions
+
+<table style="table-layout: fixed;">
+  <thead>
+    <tr>
+      <th rowspan="2" style="text-align: left; width: 150px;">Function</th>
+      <th rowspan="2" style="text-align: center;">ULP Tolerance</th>
+      <th colspan="4" style="text-align: center;">Max ULP Distance</th>
+    </tr>
+    <tr>
+      <th style="text-align: center;">llvm-libm<br>(AMDGPU)</th>
+      <th style="text-align: center;">llvm-libm<br>(CUDA)</th>
+      <th style="text-align: center;">cuda-math<br>(CUDA)</th>
+      <th style="text-align: center;">hip-math<br>(AMDGPU)</th>
+    </tr>
+  </thead>
+  <tbody>
+    <tr>
+      <td style="text-align: left;">acos</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">6 (FAILED)</td>
+      <td style="text-align: center;">6 (FAILED)</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">asin</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">6 (FAILED)</td>
+      <td style="text-align: center;">6 (FAILED)</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cbrt</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">cos</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp10</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">exp2</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">expm1</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">hypot</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">0</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log10</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log1p</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">log2</td>
+      <td style="text-align: center;">3</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sin</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sincos (cos part)</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">sincos (sin part)</td>
+      <td style="text-align: center;">4</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+    <tr>
+      <td style="text-align: left;">tan</td>
+      <td style="text-align: center;">5</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">2</td>
+      <td style="text-align: center;">1</td>
+    </tr>
+  </tbody>
+</table>
+
+**Notes on Results:**
+
+  * ULP tolerances are based on *The Khronos Group, The OpenCL C Specification v3.0.19, Sec. 7.4, Khronos Registry [July 10, 2025]*.
+  * The AMD GPU used for testing is *gfx1030*.
+  * The NVIDIA GPU used for testing is *NVIDIA RTX 4000 SFF Ada Generation*.
+
+## Adding New Tests
+
+To add a conformance test for a new math function, follow these steps:
+
+1. **Implement the Device Kernels**: Create a kernel wrapper for the new function in each provider's source file. For CUDA Math and HIP Math, you must also add a forward declaration for the vendor function in `/device_code/DeviceAPIs.hpp`.
+
+2. **Implement the Host Test**: Create a new `.cpp` file in `/tests`. This file defines the `FunctionConfig` (function and kernel names, as well as ULP tolerance) and the input generation strategy.
+
+    * Use **exhaustive testing** (`ExhaustiveGenerator`) for functions with small input spaces (e.g., half-precision functions and single-precision univariate functions).
+    * Use **randomized testing** (`RandomGenerator`) for functions with large input spaces (e.g., single-precision bivariate and double-precision functions).
+
+3. **Add the Build Target**: Add a new `add_conformance_test(...)` entry to `/tests/CMakeLists.txt` to make the test buildable.
+
+## Architecture Overview
+
+The test suite is organized into the following main directories:
+
+  * **/tests**: Contains the individual test executables, one for each function. These are the main entry points for a test run.
+  * **/device_code**: Contains the GPU kernel wrappers that call the math functions from different providers (LLVM-libm, CUDA, HIP).
+  * **/include/mathtest**: The core testing framework headers, defining the test harness, input generators, device abstraction, and result checking logic.
+  * **/lib**: The implementation files for the core testing framework.



More information about the llvm-commits mailing list