Skip to content

Commit 9ebe3cf

Browse files
authored
[SYCL][Test] Add test for libdevice float/double to bfloat16 utils (#9000)
Previously, we added utils function in libdevice to convert double/float to bfloat16, this PR aims to add corresponding test. --------- Signed-off-by: jinge90 <[email protected]>
1 parent ea4bdbd commit 9ebe3cf

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// RUN: %clangxx -fsycl %s -o %t.out
2+
// RUN: %GPU_RUN_PLACEHOLDER %t.out
3+
4+
// RUN: %clangxx -fsycl -fno-builtin -fsycl-device-lib-jit-link %s -o %t1.out
5+
// RUN: %GPU_RUN_PLACEHOLDER %t1.out
6+
//
7+
// UNSUPPORTED: cuda || hip
8+
9+
#include "imf_utils.hpp"
10+
11+
extern "C" {
12+
uint16_t __imf_double2bfloat16(double);
13+
}
14+
15+
int main() {
16+
17+
sycl::queue device_queue(sycl::default_selector_v);
18+
std::cout << "Running on "
19+
<< device_queue.get_device().get_info<sycl::info::device::name>()
20+
<< "\n";
21+
22+
if (!device_queue.get_device().has(sycl::aspect::fp64)) {
23+
std::cout << "Test skipped on platform without fp64 support." << std::endl;
24+
return 0;
25+
}
26+
27+
{
28+
std::initializer_list<double> input_vals = {
29+
__builtin_bit_cast(double, 0ULL), // 0
30+
__builtin_bit_cast(double, 0x7FF0000000000000), // +infinity
31+
__builtin_bit_cast(double, 0xFFF0000000000000), // -infinity
32+
__builtin_bit_cast(double, 0x4026800000000000), // 11.25
33+
__builtin_bit_cast(double, 0x409025643C8E4F03), // 1033.3478872524
34+
__builtin_bit_cast(double, 0x40EFFC0000000000), // 65504
35+
__builtin_bit_cast(double, 0xC0EFFC0000000000), // -65504
36+
__builtin_bit_cast(double, 0xC0D38814311F5D54), // -20000.31549820055245
37+
__builtin_bit_cast(double, 0x409F9B8D12ACEFA7), // 2022.887766554
38+
__builtin_bit_cast(double, 0x40ee120000000000), // 61584
39+
__builtin_bit_cast(double, 0xC0EE160000000000), // -61616
40+
__builtin_bit_cast(double, 0x40FAA93000000000), // 109203
41+
__builtin_bit_cast(double, 0xC1A7D8B7FF20E365), // -200039423.564234872
42+
__builtin_bit_cast(double, 0x3C370EF54646D497), // 1.25e-18
43+
__builtin_bit_cast(double, 0xBCB1B3CFC61ACF52), // -2.4567e-16
44+
__builtin_bit_cast(double, 0x39F036448D68D482), // 1.2789e-29
45+
__builtin_bit_cast(double, 0xB99C100A89BE0A2D), // -3.45899e-31
46+
__builtin_bit_cast(double, 0x47EFFFFFFFFFFFFF),
47+
__builtin_bit_cast(double, 0x47EFF00000000000),
48+
__builtin_bit_cast(double, 0x47EFD00000000000),
49+
__builtin_bit_cast(double, 0xC7EFFFFFFFFFFFFF),
50+
__builtin_bit_cast(double, 0xC7EFF00000000000),
51+
__builtin_bit_cast(double, 0xC7EFD00000000000),
52+
__builtin_bit_cast(double, 0x37AFFFFFFFFFFFFF),
53+
__builtin_bit_cast(double, 0x380FFFFFFFFFFFFF),
54+
};
55+
std::initializer_list<uint16_t> ref_vals = {
56+
0x0, 0x7F80, 0xFF80, 0x4134, 0x4481, 0x4780, 0xC780, 0xC69C, 0x44FD,
57+
0x4771, 0xC771, 0x47D5, 0xCD3F, 0x21B8, 0xA58E, 0x0F82, 0x8CE1, 0x7F80,
58+
0x7F80, 0x7F7E, 0xFF80, 0xFF80, 0xFF7E, 0x2, 0x80};
59+
test_host(input_vals, ref_vals, F(__imf_double2bfloat16));
60+
test(device_queue, input_vals, ref_vals, F(__imf_double2bfloat16));
61+
}
62+
63+
return 0;
64+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// RUN: %clangxx -fsycl %s -o %t.out
2+
// RUN: %CPU_RUN_PLACEHOLDER %t.out
3+
// RUN: %ACC_RUN_PLACEHOLDER %t.out
4+
// RUN: %GPU_RUN_PLACEHOLDER %t.out
5+
6+
// RUN: %clangxx -fsycl -fno-builtin -fsycl-device-lib-jit-link %s -o %t.out
7+
// RUN: %CPU_RUN_PLACEHOLDER %t.out
8+
// RUN: %ACC_RUN_PLACEHOLDER %t.out
9+
// RUN: %GPU_RUN_PLACEHOLDER %t.out
10+
//
11+
// UNSUPPORTED: cuda || hip
12+
13+
// All __imf_* bf16 functions are implemented via fp32 emulation, so we don't
14+
// need to check whether underlying device supports bf16 or not.
15+
#include "imf_utils.hpp"
16+
17+
extern "C" {
18+
uint16_t __imf_float2bfloat16(float);
19+
uint16_t __imf_float2bfloat16_rd(float);
20+
uint16_t __imf_float2bfloat16_rn(float);
21+
uint16_t __imf_float2bfloat16_ru(float);
22+
uint16_t __imf_float2bfloat16_rz(float);
23+
};
24+
25+
int main() {
26+
sycl::queue device_queue(sycl::default_selector_v);
27+
std::cout << "Running on "
28+
<< device_queue.get_device().get_info<sycl::info::device::name>()
29+
<< "\n";
30+
31+
{
32+
std::initializer_list<float> input_vals = {
33+
__builtin_bit_cast(float, 0x0), // +0
34+
__builtin_bit_cast(float, 0x80000000), // -0
35+
__builtin_bit_cast(float, 0x1), // min positive subnormal
36+
__builtin_bit_cast(float, 0x7FFFFF), // max positive subnormal
37+
__builtin_bit_cast(float, 0x5A6BFC), // positive subnormal
38+
__builtin_bit_cast(float, 0x80000001), // max negative subnormal
39+
__builtin_bit_cast(float, 0x807FFFFF), // min negative subnormal
40+
__builtin_bit_cast(float, 0x805A6FED), // negative subnormal
41+
__builtin_bit_cast(float, 0x7F800000), // +inf
42+
__builtin_bit_cast(float, 0xFF800000), // -inf
43+
__builtin_bit_cast(float, 0x2E05CBA9), // positive normal
44+
__builtin_bit_cast(float, 0x7E5A8935), // positive normal
45+
__builtin_bit_cast(float, 0xAE4411FC), // negative normal
46+
__builtin_bit_cast(float, 0xFA84C773), // negative normal
47+
__builtin_bit_cast(float, 0x7F7FFFFF), // max positive normal
48+
__builtin_bit_cast(float, 0x765FCEED), // positive normal
49+
__builtin_bit_cast(float, 0xFF7FFFFF), // min negative normal
50+
__builtin_bit_cast(float, 0xAC763561), // negative normal
51+
};
52+
53+
std::initializer_list<uint16_t> ref_vals = {
54+
0x0, 0x8000, 0x0, 0x80, 0x5a, 0x8000, 0x8080, 0x805A, 0x7F80,
55+
0xFF80, 0x2E06, 0x7E5B, 0xAE44, 0xFA85, 0x7F80, 0x7660, 0xFF80, 0xAC76};
56+
57+
std::initializer_list<uint16_t> ref_vals_rd = {
58+
0x0, 0x8000, 0x0, 0x7F, 0x5A, 0x8001, 0x8080, 0x805B, 0x7F80,
59+
0xFF80, 0x2E05, 0x7E5A, 0xAE45, 0xFA85, 0x7F7F, 0x765F, 0xFF80, 0xAC77};
60+
61+
std::initializer_list<uint16_t> ref_vals_ru = {
62+
0x0, 0x8000, 0x1, 0x80, 0x5B, 0x8000, 0x807F, 0x805A, 0x7F80,
63+
0xFF80, 0x2E06, 0x7E5B, 0xAE44, 0xFA84, 0x7F80, 0x7660, 0xFF7F, 0xAC76};
64+
65+
std::initializer_list<uint16_t> ref_vals_rz = {
66+
0x0, 0x8000, 0x0, 0x7F, 0x5A, 0x8000, 0x807F, 0x805A, 0x7F80,
67+
0xFF80, 0x2E05, 0x7E5A, 0xAE44, 0xFA84, 0x7F7F, 0x765F, 0xFF7F, 0xAC76};
68+
69+
test_host(input_vals, ref_vals, F(__imf_float2bfloat16));
70+
test_host(input_vals, ref_vals_rd, F(__imf_float2bfloat16_rd));
71+
test_host(input_vals, ref_vals, F(__imf_float2bfloat16_rn));
72+
test_host(input_vals, ref_vals_ru, F(__imf_float2bfloat16_ru));
73+
test_host(input_vals, ref_vals_rz, F(__imf_float2bfloat16_rz));
74+
test(device_queue, input_vals, ref_vals, F(__imf_float2bfloat16));
75+
test(device_queue, input_vals, ref_vals_rd, F(__imf_float2bfloat16_rd));
76+
test(device_queue, input_vals, ref_vals, F(__imf_float2bfloat16_rn));
77+
test(device_queue, input_vals, ref_vals_ru, F(__imf_float2bfloat16_ru));
78+
test(device_queue, input_vals, ref_vals_rz, F(__imf_float2bfloat16_rz));
79+
}
80+
return 0;
81+
}

0 commit comments

Comments
 (0)