From 81caf854c3696c9e404ded4a02ef3baa9d4aec6c Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 10 Apr 2024 18:02:58 -0700 Subject: [PATCH 1/6] [SYCL][E2E] Ensure lowering of llvm.bitreverse for 2/4-bit scalars is functionally correct Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 8e021ca6540c5..bd630bf1a5e38 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -31,6 +31,8 @@ // Execution should still be correct. // RUN: %{run} %t.bitinstructions.out +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i2" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i4" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i8" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i16" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i32" @@ -56,6 +58,8 @@ // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i16" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i32" +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i2" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i4" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_i8" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_i16" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_i32" Export @@ -125,6 +129,14 @@ template class BitreverseTest; template void do_scalar_bitreverse_test() { queue q; + // calculate bitlength + int bitlength=0; + TYPE t=1; + do { + ++bitlength; + t<<=1; + } while(t); + TYPE *Input = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); TYPE *Output = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), @@ -140,9 +152,10 @@ template void do_scalar_bitreverse_test() { }); q.wait(); for (unsigned i = 0; i < NUM_TESTS; i++) - if (Output[i] != reference_reverse(Input[i], sizeof(TYPE) * 8)) { - std::cerr << "Failed for scalar " << std::hex << Input[i] - << " sizeof=" << sizeof(TYPE) << "\n"; + if (Output[i] != reference_reverse(Input[i], bitlength)) { + std::cerr << "Failed for scalar " << std::hex << static_cast(Input[i]) + << " bitlength=" << bitlength << "\n"; + exit(-1); } @@ -184,6 +197,12 @@ template void do_vector_bitreverse_test() { free(Output, q.get_context()); } +using uint2_t = _BitInt(2); +using uint4_t = _BitInt(4); + +// Vectors of uint2_t and uint4_t not allowed. +// Vector elements must be at least as wide as CHAR_BIT + using uint8_t2 = uint8_t __attribute__((ext_vector_type(2))); using uint16_t2 = uint16_t __attribute__((ext_vector_type(2))); using uint32_t2 = uint32_t __attribute__((ext_vector_type(2))); @@ -212,6 +231,8 @@ using uint64_t16 = uint64_t __attribute__((ext_vector_type(16))); int main() { srand(2024); + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); From fa821796f776dcc9aa476452c2101897203f08fd Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Fri, 10 May 2024 09:04:48 -0700 Subject: [PATCH 2/6] Apply clang-format Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index bd630bf1a5e38..2af1819c39b9e 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -130,12 +130,12 @@ template void do_scalar_bitreverse_test() { queue q; // calculate bitlength - int bitlength=0; - TYPE t=1; + int bitlength = 0; + TYPE t = 1; do { ++bitlength; - t<<=1; - } while(t); + t <<= 1; + } while (t); TYPE *Input = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); @@ -153,8 +153,9 @@ template void do_scalar_bitreverse_test() { q.wait(); for (unsigned i = 0; i < NUM_TESTS; i++) if (Output[i] != reference_reverse(Input[i], bitlength)) { - std::cerr << "Failed for scalar " << std::hex << static_cast(Input[i]) - << " bitlength=" << bitlength << "\n"; + std::cerr << "Failed for scalar " << std::hex + << static_cast(Input[i]) << " bitlength=" << bitlength + << "\n"; exit(-1); } From faa7fa5fc673db1e220a6c42982d8cd445713ed1 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Fri, 17 May 2024 06:47:31 -0700 Subject: [PATCH 3/6] Add XFAIL for gpu-intel-gen12 Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 2af1819c39b9e..3d025184c102e 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -2,6 +2,9 @@ // UNSUPPORTED: hip || cuda +// TODO: Remove XFAIL after fixing https://github.com/intel/intel-graphics-compiler/issues/330 +// XFAIL: gpu-intel-gen12 + // Make dump directory. // RUN: rm -rf %t.spvdir && mkdir %t.spvdir From 7aaba66c73d078f5032edc48271a7e11cb067f5f Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Fri, 17 May 2024 07:22:17 -0700 Subject: [PATCH 4/6] Fix formatting Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 3d025184c102e..7b0ec8c8d856f 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -2,7 +2,8 @@ // UNSUPPORTED: hip || cuda -// TODO: Remove XFAIL after fixing https://github.com/intel/intel-graphics-compiler/issues/330 +// TODO: Remove XFAIL after fixing +// https://github.com/intel/intel-graphics-compiler/issues/330 // XFAIL: gpu-intel-gen12 // Make dump directory. From 1348b6092d193f80fa8c9b6a16ed86f280e5f7bf Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Fri, 17 May 2024 15:59:54 -0700 Subject: [PATCH 5/6] Move 2/4-bit bitreverse testing to new file. XFAIL on gpu. Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 32 +---- .../sub_byte_bitreverse.cpp | 120 ++++++++++++++++++ 2 files changed, 123 insertions(+), 29 deletions(-) create mode 100644 sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 7b0ec8c8d856f..8e021ca6540c5 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -2,10 +2,6 @@ // UNSUPPORTED: hip || cuda -// TODO: Remove XFAIL after fixing -// https://github.com/intel/intel-graphics-compiler/issues/330 -// XFAIL: gpu-intel-gen12 - // Make dump directory. // RUN: rm -rf %t.spvdir && mkdir %t.spvdir @@ -35,8 +31,6 @@ // Execution should still be correct. // RUN: %{run} %t.bitinstructions.out -// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i2" -// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i4" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i8" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i16" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i32" @@ -62,8 +56,6 @@ // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i16" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i32" -// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i2" Export -// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i4" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_i8" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_i16" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_i32" Export @@ -133,14 +125,6 @@ template class BitreverseTest; template void do_scalar_bitreverse_test() { queue q; - // calculate bitlength - int bitlength = 0; - TYPE t = 1; - do { - ++bitlength; - t <<= 1; - } while (t); - TYPE *Input = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); TYPE *Output = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), @@ -156,11 +140,9 @@ template void do_scalar_bitreverse_test() { }); q.wait(); for (unsigned i = 0; i < NUM_TESTS; i++) - if (Output[i] != reference_reverse(Input[i], bitlength)) { - std::cerr << "Failed for scalar " << std::hex - << static_cast(Input[i]) << " bitlength=" << bitlength - << "\n"; - + if (Output[i] != reference_reverse(Input[i], sizeof(TYPE) * 8)) { + std::cerr << "Failed for scalar " << std::hex << Input[i] + << " sizeof=" << sizeof(TYPE) << "\n"; exit(-1); } @@ -202,12 +184,6 @@ template void do_vector_bitreverse_test() { free(Output, q.get_context()); } -using uint2_t = _BitInt(2); -using uint4_t = _BitInt(4); - -// Vectors of uint2_t and uint4_t not allowed. -// Vector elements must be at least as wide as CHAR_BIT - using uint8_t2 = uint8_t __attribute__((ext_vector_type(2))); using uint16_t2 = uint16_t __attribute__((ext_vector_type(2))); using uint32_t2 = uint32_t __attribute__((ext_vector_type(2))); @@ -236,8 +212,6 @@ using uint64_t16 = uint64_t __attribute__((ext_vector_type(16))); int main() { srand(2024); - do_scalar_bitreverse_test(); - do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp new file mode 100644 index 0000000000000..a8e7412c466d6 --- /dev/null +++ b/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp @@ -0,0 +1,120 @@ +// Test that llvm.bitreverse is lowered correctly by llvm-spirv for 2/4-bit types. + +// UNSUPPORTED: hip || cuda + +// TODO: Remove XFAIL after fixing +// https://github.com/intel/intel-graphics-compiler/issues/330 +// XFAIL: gpu + +// Make dump directory. +// RUN: rm -rf %t.spvdir && mkdir %t.spvdir + +// Ensure that SPV_KHR_bit_instructions is disabled so that translator +// will lower llvm.bitreverse.* intrinsics instead of relying on SPIRV +// BitReverse instruction. +// Also build executable with SPV dump. +// RUN: %{build} -o %t.out -O2 -Xspirv-translator --spirv-ext=-SPV_KHR_bit_instructions -fsycl-dump-device-code=%t.spvdir + +// Rename SPV file to explictly known filename. +// RUN: mv %t.spvdir/*.spv %t.spvdir/dump.spv + +// Convert to text. +// RUN: llvm-spirv -to-text %t.spvdir/dump.spv + +// Check that all lowerings are done by llvm-spirv. +// RUN: cat %t.spvdir/dump.spt | FileCheck %s --check-prefix CHECK-SPV --implicit-check-not=BitReverse + +// Execute to ensure lowering has correct functionality. +// RUN: %{run} %t.out + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Build without lowering explicitly disabled. +// RUN: %{build} -o %t.bitinstructions.out + +// Execution should still be correct. +// RUN: %{run} %t.bitinstructions.out + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i2" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i4" + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i2" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i4" Export + +#include "common.hpp" +#include +#include +#include + +using namespace sycl; + +template +__attribute__((optnone, noinline)) TYPE reference_reverse(TYPE a, + const int bitlength) { + TYPE ret = 0; + for (auto i = 0; i < bitlength; i++) { + ret <<= 1; + ret |= a & 0x1; + a >>= 1; + } + return ret; +} + +template +__attribute__((noinline)) TYPE reverse(TYPE a, int bitlength) { + return __builtin_elementwise_bitreverse(a); +} + +template class BitreverseTest; + +#define NUM_TESTS 1024 + +template void do_scalar_bitreverse_test() { + queue q; + + // calculate bitlength + int bitlength = 0; + TYPE t = 1; + do { + ++bitlength; + t <<= 1; + } while (t); + + TYPE *Input = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), + q.get_context()); + TYPE *Output = (TYPE *)malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), + q.get_context()); + + for (unsigned i = 0; i < NUM_TESTS; i++) + Input[i] = get_rand(); + q.submit([=](handler &cgh) { + cgh.single_task>([=]() { + for (unsigned i = 0; i < NUM_TESTS; i++) + Output[i] = reverse(Input[i], sizeof(TYPE) * 8); + }); + }); + q.wait(); + for (unsigned i = 0; i < NUM_TESTS; i++) + if (Output[i] != reference_reverse(Input[i], bitlength)) { + std::cerr << "Failed for scalar " << std::hex + << static_cast(Input[i]) << " bitlength=" << bitlength + << "\n"; + + exit(-1); + } + + free(Input, q.get_context()); + free(Output, q.get_context()); +} + +using uint2_t = _BitInt(2); +using uint4_t = _BitInt(4); + +int main() { + srand(2024); + + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); + + return 0; +} From d44396172ec78a92ea7b31ecb32159c74bd29260 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Fri, 17 May 2024 16:07:01 -0700 Subject: [PATCH 6/6] Fix formatting Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp index a8e7412c466d6..b576e5bd5db1b 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/sub_byte_bitreverse.cpp @@ -1,4 +1,5 @@ -// Test that llvm.bitreverse is lowered correctly by llvm-spirv for 2/4-bit types. +// Test that llvm.bitreverse is lowered correctly by llvm-spirv for 2/4-bit +// types. // UNSUPPORTED: hip || cuda