
This PR introduces the initial version of a C++ framework for the conformance testing of GPU math library functions, building upon the skeleton provided in #146391. The main goal of this framework is to systematically measure the accuracy of math functions in the GPU libc, verifying correctness or at least conformance to standards like OpenCL via exhaustive or random accuracy tests.
57 lines
1.9 KiB
C++
57 lines
1.9 KiB
C++
//===----------------------------------------------------------------------===//
|
||
//
|
||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
// See https://llvm.org/LICENSE.txt for license information.
|
||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
//
|
||
//===----------------------------------------------------------------------===//
|
||
///
|
||
/// \file
|
||
/// This file contains the conformance test of the logf function.
|
||
///
|
||
//===----------------------------------------------------------------------===//
|
||
|
||
#include "mathtest/CommandLineExtras.hpp"
|
||
#include "mathtest/ExhaustiveGenerator.hpp"
|
||
#include "mathtest/IndexedRange.hpp"
|
||
#include "mathtest/TestConfig.hpp"
|
||
#include "mathtest/TestRunner.hpp"
|
||
|
||
#include "llvm/ADT/StringRef.h"
|
||
|
||
#include <cstdlib>
|
||
#include <limits>
|
||
#include <math.h>
|
||
|
||
namespace mathtest {
|
||
|
||
template <> struct FunctionConfig<logf> {
|
||
static constexpr llvm::StringRef Name = "logf";
|
||
static constexpr llvm::StringRef KernelName = "logfKernel";
|
||
|
||
// Source: The Khronos Group, The OpenCL C Specification v3.0.19, Sec. 7.4,
|
||
// Table 65, Khronos Registry [July 10, 2025].
|
||
static constexpr uint64_t UlpTolerance = 3;
|
||
};
|
||
} // namespace mathtest
|
||
|
||
int main(int argc, const char **argv) {
|
||
llvm::cl::ParseCommandLineOptions(argc, argv,
|
||
"Conformance test of the logf function");
|
||
|
||
using namespace mathtest;
|
||
|
||
IndexedRange<float> Range(/*Begin=*/0.0f,
|
||
/*End=*/std::numeric_limits<float>::infinity(),
|
||
/*Inclusive=*/true);
|
||
ExhaustiveGenerator<float> Generator(Range);
|
||
|
||
const auto Configs = cl::getTestConfigs();
|
||
const llvm::StringRef DeviceBinaryDir = DEVICE_BINARY_DIR;
|
||
const bool IsVerbose = cl::IsVerbose;
|
||
|
||
bool Passed = runTests<logf>(Generator, Configs, DeviceBinaryDir, IsVerbose);
|
||
|
||
return Passed ? EXIT_SUCCESS : EXIT_FAILURE;
|
||
}
|