mirror of
https://github.com/KhronosGroup/OpenCL-CTS.git
synced 2026-03-19 06:09:01 +00:00
* Added cl_khr_fp16 support for test_relationals (issue #142, relationals) * Added cl_khr_fp16 support for any and bitselect test cases (issue #142, relationals) * correction related to automated travis build for macOS (issue #142, relationals) * more corrections related to automated travis build for macOS (issue #142, relationals) * Added few cosmetic corrections (issue #142, test_relationals) * Added missing clang format * Added corrections related to order of initialization * Added corrections due to code review (issue #142, relationals) * Correction for prev commit * Added subnormals related condition for test verification (issue #142, relationals) * Added indexing correction due to code review * Replaced hardcoded iteration limit (issue #142, relationals)
228 lines
6.1 KiB
C++
228 lines
6.1 KiB
C++
//
|
|
// Copyright (c) 2022 The Khronos Group Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
|
|
#ifndef _TEST_COMPARISONS_FP_H
|
|
#define _TEST_COMPARISONS_FP_H
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <CL/cl_half.h>
|
|
|
|
#include "testBase.h"
|
|
|
|
#define HALF_NAN 0x7e00
|
|
template <typename T> using VerifyFunc = bool (*)(const T &, const T &);
|
|
|
|
struct RelTestBase
|
|
{
|
|
explicit RelTestBase(const ExplicitTypes &dt): dataType(dt) {}
|
|
ExplicitTypes dataType;
|
|
};
|
|
|
|
template <typename T> struct RelTestParams : public RelTestBase
|
|
{
|
|
RelTestParams(const VerifyFunc<T> &vfn, const ExplicitTypes &dt,
|
|
const T &nan_)
|
|
: RelTestBase(dt), verifyFn(vfn), nan(nan_)
|
|
{}
|
|
|
|
VerifyFunc<T> verifyFn;
|
|
T nan;
|
|
};
|
|
|
|
struct RelationalsFPTest
|
|
{
|
|
RelationalsFPTest(cl_context context, cl_device_id device,
|
|
cl_command_queue queue, const char *fn, const char *op);
|
|
|
|
virtual cl_int SetUp(int elements);
|
|
|
|
// Test body returning an OpenCL error code
|
|
virtual cl_int Run();
|
|
|
|
template <typename T>
|
|
void generate_equiv_test_data(T *, unsigned int, bool,
|
|
const RelTestParams<T> &, const MTdata &);
|
|
|
|
template <typename T, typename U>
|
|
void verify_equiv_values(unsigned int, const T *const, const T *const,
|
|
U *const, const VerifyFunc<T> &);
|
|
|
|
template <typename T>
|
|
int test_equiv_kernel(unsigned int vecSize, const RelTestParams<T> ¶m,
|
|
const MTdata &d);
|
|
|
|
template <typename T>
|
|
int test_relational(int numElements, const RelTestParams<T> ¶m);
|
|
|
|
protected:
|
|
cl_context context;
|
|
cl_device_id device;
|
|
cl_command_queue queue;
|
|
|
|
std::string fnName;
|
|
std::string opName;
|
|
|
|
std::vector<std::unique_ptr<RelTestBase>> params;
|
|
std::map<ExplicitTypes, std::string> eqTypeNames;
|
|
size_t num_elements;
|
|
|
|
int halfFlushDenormsToZero;
|
|
};
|
|
|
|
struct IsEqualFPTest : public RelationalsFPTest
|
|
{
|
|
IsEqualFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "isequal", "==")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
// for correct handling nan/inf we need fp value
|
|
struct half_equals_to
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
return cl_half_to_float(lhs) == cl_half_to_float(rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
struct IsNotEqualFPTest : public RelationalsFPTest
|
|
{
|
|
IsNotEqualFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "isnotequal", "!=")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
// for correct handling nan/inf we need fp value
|
|
struct half_not_equals_to
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
return cl_half_to_float(lhs) != cl_half_to_float(rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
struct IsGreaterFPTest : public RelationalsFPTest
|
|
{
|
|
IsGreaterFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "isgreater", ">")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
struct half_greater
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
return cl_half_to_float(lhs) > cl_half_to_float(rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
struct IsGreaterEqualFPTest : public RelationalsFPTest
|
|
{
|
|
IsGreaterEqualFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "isgreaterequal", ">=")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
struct half_greater_equal
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
return cl_half_to_float(lhs) >= cl_half_to_float(rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
struct IsLessFPTest : public RelationalsFPTest
|
|
{
|
|
IsLessFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "isless", "<")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
struct half_less
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
return cl_half_to_float(lhs) < cl_half_to_float(rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
struct IsLessEqualFPTest : public RelationalsFPTest
|
|
{
|
|
IsLessEqualFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "islessequal", "<=")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
struct half_less_equal
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
return cl_half_to_float(lhs) <= cl_half_to_float(rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
struct IsLessGreaterFPTest : public RelationalsFPTest
|
|
{
|
|
IsLessGreaterFPTest(cl_device_id d, cl_context c, cl_command_queue q)
|
|
: RelationalsFPTest(c, d, q, "islessgreater", "<>")
|
|
{}
|
|
cl_int SetUp(int elements) override;
|
|
|
|
struct half_less_greater
|
|
{
|
|
bool operator()(const cl_half &lhs, const cl_half &rhs) const
|
|
{
|
|
float flhs = cl_half_to_float(lhs), frhs = cl_half_to_float(rhs);
|
|
return (flhs < frhs) || (flhs > frhs);
|
|
}
|
|
};
|
|
|
|
template <typename T> struct less_greater
|
|
{
|
|
bool operator()(const T &lhs, const T &rhs) const
|
|
{
|
|
return (lhs < rhs) || (lhs > rhs);
|
|
}
|
|
};
|
|
};
|
|
|
|
template <class T>
|
|
int MakeAndRunTest(cl_device_id device, cl_context context,
|
|
cl_command_queue queue, int num_elements)
|
|
{
|
|
auto test_fixture = T(device, context, queue);
|
|
|
|
cl_int error = test_fixture.SetUp(num_elements);
|
|
test_error_ret(error, "Error in test initialization", TEST_FAIL);
|
|
|
|
error = test_fixture.Run();
|
|
test_error_ret(error, "Test Failed", TEST_FAIL);
|
|
|
|
return TEST_PASS;
|
|
}
|
|
|
|
#endif // _TEST_COMPARISONS_FP_H
|