-
Notifications
You must be signed in to change notification settings - Fork 731
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[SYCL][ESIMD] Report an error when slm_init is called more than once …
…in the kernel (#12804) The patch reports an error if: - sim_init() is used together with local_accessor - slm_init() is called not from ESIMD kernel - slm_init() is called more than once in ESIMD kernel Co-authored-by: Vyacheslav Klochkov <[email protected]>
- Loading branch information
1 parent
6e9a3dd
commit 3f43d47
Showing
8 changed files
with
247 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// RUN: not %clangxx -fsycl %s 2>&1 | FileCheck %s | ||
|
||
// This test verifies more than 1 call to slm_init triggers an error. | ||
|
||
#include <iostream> | ||
#include <sycl/ext/intel/esimd.hpp> | ||
#include <sycl/sycl.hpp> | ||
|
||
using namespace sycl; | ||
using namespace sycl::ext::intel::esimd; | ||
|
||
int main() { | ||
queue Q; | ||
nd_range<1> NDR{range<1>{2}, range<1>{2}}; | ||
Q.parallel_for(NDR, [=](nd_item<1> NDI) SYCL_ESIMD_KERNEL { | ||
slm_init(1024); | ||
slm_init(1024); | ||
}).wait(); | ||
// CHECK: error: slm_init is called more than once from kernel 'typeinfo name for main::'lambda'(sycl::_V1::nd_item<1>)'. | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// This test verifies call to slm_init from a function called through | ||
// invoke_simd triggers an error. | ||
|
||
// RUN: not %clangxx -fsycl -fno-sycl-device-code-split-esimd -Xclang -fsycl-allow-func-ptr %s 2>&1 | FileCheck %s | ||
|
||
#include <sycl/ext/intel/esimd.hpp> | ||
#include <sycl/ext/oneapi/experimental/invoke_simd.hpp> | ||
#include <sycl/ext/oneapi/experimental/uniform.hpp> | ||
#include <sycl/sycl.hpp> | ||
|
||
#include <functional> | ||
#include <iostream> | ||
#include <type_traits> | ||
|
||
using namespace sycl::ext::oneapi::experimental; | ||
using namespace sycl; | ||
namespace esimd = sycl::ext::intel::esimd; | ||
|
||
SYCL_EXTERNAL | ||
[[intel::device_indirectly_callable]] void __regcall SIMD_CALLEE_VOID() | ||
SYCL_ESIMD_FUNCTION { | ||
esimd::slm_init<1024>(); | ||
} | ||
|
||
int main() { | ||
queue Q; | ||
nd_range<1> NDR{range<1>{2}, range<1>{2}}; | ||
Q.parallel_for(NDR, [=](nd_item<1> NDI) [[intel::reqd_sub_group_size(16)]] { | ||
sub_group sg = NDI.get_sub_group(); | ||
invoke_simd(sg, SIMD_CALLEE_VOID); | ||
}).wait(); | ||
return 0; | ||
} | ||
// CHECK: slm_init must be called directly from ESIMD kernel. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// RUN: %clangxx -fsycl %s | ||
|
||
// This test verifies usage of slm_init and local_accessor in different kernels | ||
// passes. | ||
|
||
#include <iostream> | ||
#include <sycl/ext/intel/esimd.hpp> | ||
#include <sycl/sycl.hpp> | ||
|
||
using namespace sycl; | ||
using namespace sycl::ext::intel::esimd; | ||
|
||
int main() { | ||
queue Q; | ||
nd_range<1> NDR{range<1>{2}, range<1>{2}}; | ||
Q.submit([&](handler &CGH) { | ||
auto InAcc = local_accessor<int, 1>(5, CGH); | ||
CGH.parallel_for(NDR, [=](nd_item<1> NDI) SYCL_ESIMD_KERNEL { | ||
scalar_load<int>(InAcc, 0); | ||
}); | ||
}).wait(); | ||
|
||
Q.submit([&](handler &CGH) { | ||
CGH.parallel_for(NDR, [=](nd_item<1> NDI) | ||
SYCL_ESIMD_KERNEL { slm_init(1024); }); | ||
}).wait(); | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// RUN: not %clangxx -fsycl %s 2>&1 | FileCheck %s | ||
|
||
// This test verifies usage of slm_init and local_accessor triggers an error. | ||
|
||
#include <iostream> | ||
#include <sycl/ext/intel/esimd.hpp> | ||
#include <sycl/sycl.hpp> | ||
|
||
using namespace sycl; | ||
using namespace sycl::ext::intel::esimd; | ||
|
||
int main() { | ||
queue Q; | ||
nd_range<1> NDR{range<1>{2}, range<1>{2}}; | ||
Q.submit([&](handler &CGH) { | ||
auto InAcc = local_accessor<int, 1>(5, CGH); | ||
CGH.parallel_for(NDR, [=](nd_item<1> NDI) SYCL_ESIMD_KERNEL { | ||
slm_init(1024); | ||
scalar_load<int>(InAcc, 0); | ||
}); | ||
}).wait(); | ||
// CHECK: error: slm_init can not be used with local accessors. | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// RUN: not %clangxx -fsycl %s 2>&1 | FileCheck %s | ||
|
||
// This test verifies usage of slm_init and local_accessor triggers an error. | ||
|
||
#include <iostream> | ||
#include <sycl/ext/intel/esimd.hpp> | ||
#include <sycl/sycl.hpp> | ||
|
||
using namespace sycl; | ||
using namespace sycl::ext::intel::esimd; | ||
|
||
int main() { | ||
queue Q; | ||
nd_range<1> NDR{range<1>{2}, range<1>{2}}; | ||
Q.submit([&](handler &CGH) { | ||
auto InAcc = local_accessor<int, 1>(5, CGH); | ||
CGH.parallel_for(NDR, [=](nd_item<1> NDI) SYCL_ESIMD_KERNEL { | ||
slm_init(1024); | ||
InAcc[0] = 5; | ||
}); | ||
}).wait(); | ||
// CHECK: error: slm_init can not be used with local accessors. | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// RUN: not %clangxx -fsycl %s 2>&1 | FileCheck %s | ||
|
||
// This test verifies call to slm_init from a function marked as | ||
// noinline triggers an error. | ||
|
||
#include <iostream> | ||
#include <sycl/ext/intel/esimd.hpp> | ||
#include <sycl/sycl.hpp> | ||
|
||
using namespace sycl; | ||
using namespace sycl::ext::intel::esimd; | ||
|
||
#ifdef _MSC_VER | ||
#define __SYCL_NOINLINE __declspec(noinline) | ||
#else | ||
#define __SYCL_NOINLINE __attribute__((noinline)) | ||
#endif | ||
|
||
__SYCL_NOINLINE void bar() { slm_init(1024); } | ||
__SYCL_NOINLINE void foo() { | ||
slm_init(1024); | ||
bar(); | ||
} | ||
|
||
int main() { | ||
queue Q; | ||
nd_range<1> NDR{range<1>{2}, range<1>{2}}; | ||
Q.parallel_for(NDR, [=](nd_item<1> NDI) SYCL_ESIMD_KERNEL { foo(); }).wait(); | ||
return 0; | ||
} | ||
// CHECK: error: slm_init is called more than once from kernel 'typeinfo name for main::'lambda'(sycl::_V1::nd_item<1>)'. |