Skip to content
This repository was archived by the owner on Mar 28, 2023. It is now read-only.

Commit b279d46

Browse files
authored
[ESIMD] Add test to validate tanh function fix (#1361)
1 parent de9a209 commit b279d46

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
// REQUIRES: gpu
2+
// UNSUPPORTED: cuda || hip
3+
// TODO online compiler check fails for esimd_emulator
4+
// XFAIL: esimd_emulator
5+
// RUN: %clangxx -fsycl %s -o %t.out
6+
// RUN: %GPU_RUN_PLACEHOLDER %t.out
7+
8+
//==- tanh_fix_test.cpp - Test for tanh -==//
9+
//
10+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
11+
// See https://llvm.org/LICENSE.txt for license information.
12+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
13+
//
14+
//===----------------------------------------------------------------------===//
15+
16+
#include <cmath>
17+
#include <iostream>
18+
#include <sycl/ext/intel/esimd.hpp>
19+
#include <sycl/ext/intel/esimd/simd.hpp>
20+
#include <sycl/sycl.hpp>
21+
#include <vector>
22+
23+
constexpr auto sycl_write = sycl::access::mode::write;
24+
#define SIMD 16
25+
26+
int test_tanh(float x) {
27+
std::vector<float> out(SIMD);
28+
std::vector<float> out1(SIMD);
29+
30+
float ha = x;
31+
float scalar_result = 0;
32+
float scalar_result1 = 0;
33+
34+
{
35+
sycl::queue queue;
36+
37+
sycl::buffer<float, 1> vector_buffer(out.data(), out.size());
38+
sycl::buffer<float, 1> scalar_buffer(&scalar_result, sycl::range<1>(1));
39+
sycl::buffer<float, 1> vector_buffer1(out1.data(), out1.size());
40+
sycl::buffer<float, 1> scalar_buffer1(&scalar_result1, sycl::range<1>(1));
41+
42+
auto e = queue.submit([&](sycl::handler &cgh) {
43+
sycl::accessor<float, 1, sycl_write> vector_out =
44+
vector_buffer.get_access<sycl_write>(cgh);
45+
sycl::accessor<float, 1, sycl_write> scalar_out =
46+
scalar_buffer.get_access<sycl_write>(cgh);
47+
sycl::accessor<float, 1, sycl_write> vector_out1 =
48+
vector_buffer1.get_access<sycl_write>(cgh);
49+
sycl::accessor<float, 1, sycl_write> scalar_out1 =
50+
scalar_buffer1.get_access<sycl_write>(cgh);
51+
52+
auto kernel = ([=]() [[intel::sycl_explicit_simd]] {
53+
using namespace sycl::ext::intel::esimd;
54+
55+
simd<float, SIMD> a = ha;
56+
57+
simd<float, SIMD> vector_result =
58+
sycl::ext::intel::experimental::esimd::tanh(a);
59+
simd<float, 1> scalar_result =
60+
sycl::ext::intel::experimental::esimd::tanh(ha);
61+
simd<float, SIMD> vector_result1 =
62+
sycl::ext::intel::experimental::esimd::tanh_cody_waite(a);
63+
simd<float, 1> scalar_result1 =
64+
sycl::ext::intel::experimental::esimd::tanh_cody_waite(ha);
65+
66+
vector_result.copy_to(vector_out, 0);
67+
scalar_result.copy_to(scalar_out, 0);
68+
vector_result1.copy_to(vector_out1, 0);
69+
scalar_result1.copy_to(scalar_out1, 0);
70+
});
71+
72+
cgh.single_task<class Reduction>(kernel);
73+
});
74+
queue.wait();
75+
}
76+
77+
float std_result = std::tanh(ha);
78+
79+
if (std::fabs(std_result - scalar_result) > 0.000001f) {
80+
std::cout << "Scalar test failed for " << x << "." << std::endl;
81+
return 1;
82+
}
83+
84+
if (std::fabs(std_result - scalar_result1) > 0.000001f) {
85+
std::cout << "Scalar test failed for cody waite implementation for " << x
86+
<< "." << std::endl;
87+
return 1;
88+
}
89+
90+
for (int i = 0; i < SIMD; ++i) {
91+
if (scalar_result != out[i] &&
92+
!(std::isnan(scalar_result) && std::isnan(out[i]))) {
93+
std::cout << "Vector test failed for " << x << "." << std::endl;
94+
return 1;
95+
}
96+
97+
if (scalar_result1 != out1[i] &&
98+
!(std::isnan(scalar_result1) && std::isnan(out1[i]))) {
99+
std::cout << "Vector test failed for cody waite implementation for " << x
100+
<< "." << std::endl;
101+
return 1;
102+
}
103+
}
104+
105+
return 0;
106+
}
107+
108+
int main() {
109+
110+
int test_result = 0;
111+
112+
for (float x = -100.f; x < 100.f; x += 0.1f) {
113+
test_result |= test_tanh(x);
114+
}
115+
116+
if (!test_result) {
117+
std::cout << "Pass" << std::endl;
118+
}
119+
return test_result;
120+
}

0 commit comments

Comments
 (0)