Skip to content

Commit 38f28a2

Browse files
[SYCL] Fix and re-enable some kernel-and-program/Cache.cpp unit tests. (#8121)
These unit tests were disabled when the sycl::program class was removed in [#6666](#6666.) I have modified some of these unit tests to use kernel_bundles instead of sycl::program. I was not able to modify and re-enable all the unit tests in Cache.cpp file because some of the older test cases were using APIs like sycl::program.build_with_source (or compile_with_source) and, as far as I am aware of it, there is no kernel_bundle API(s) equivalent to sycl::program.build_with_source.
1 parent 33c35fd commit 38f28a2

File tree

1 file changed

+105
-29
lines changed

1 file changed

+105
-29
lines changed

sycl/unittests/kernel-and-program/Cache.cpp

Lines changed: 105 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class CacheTestKernel2 {
3737
};
3838

3939
namespace sycl {
40+
const static specialization_id<int> SpecConst1{42};
4041
__SYCL_INLINE_VER_NAMESPACE(_V1) {
4142
namespace detail {
4243
struct MockKernelInfo {
@@ -57,6 +58,9 @@ template <> struct KernelInfo<CacheTestKernel> : public MockKernelInfo {
5758
template <> struct KernelInfo<CacheTestKernel2> : public MockKernelInfo {
5859
static constexpr const char *getName() { return "CacheTestKernel2"; }
5960
};
61+
template <> const char *get_spec_constant_symbolic_ID<SpecConst1>() {
62+
return "SC1";
63+
}
6064
} // namespace detail
6165
} // __SYCL_INLINE_VER_NAMESPACE(_V1)
6266
} // namespace sycl
@@ -172,18 +176,111 @@ TEST_F(KernelAndProgramCacheTest,
172176
EXPECT_EQ(Cache.size(), 0U) << "Expect empty cache for source programs";
173177
}
174178

175-
// Check that programs built without options are cached.
176-
TEST_F(KernelAndProgramCacheTest, DISABLED_ProgramBuildPositive) {
177-
context Ctx{Plt};
178-
// program Prg1{Ctx};
179-
// program Prg2{Ctx};
179+
// Check that kernel_bundles with input_state are not cached.
180+
TEST_F(KernelAndProgramCacheTest, KernelBundleInputState) {
181+
std::vector<sycl::device> Devices = Plt.get_devices();
182+
sycl::context Ctx(Devices[0]);
183+
184+
auto KernelID1 = sycl::get_kernel_id<CacheTestKernel>();
185+
sycl::kernel_bundle KernelBundle1 =
186+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {KernelID1});
187+
188+
auto CtxImpl = detail::getSyclObjImpl(Ctx);
189+
detail::KernelProgramCache::ProgramCacheT &Cache =
190+
CtxImpl->getKernelProgramCache().acquireCachedPrograms().get();
191+
192+
EXPECT_EQ(Cache.size(), 0U)
193+
<< "Expect empty cache for kernel_bundles build with input_state.";
194+
}
195+
196+
// Check that kernel_bundles with object_state are not cached.
197+
TEST_F(KernelAndProgramCacheTest, KernelBundleObjectState) {
198+
std::vector<sycl::device> Devices = Plt.get_devices();
199+
sycl::context Ctx(Devices[0]);
200+
201+
auto KernelID1 = sycl::get_kernel_id<CacheTestKernel>();
202+
sycl::kernel_bundle KernelBundle1 =
203+
sycl::get_kernel_bundle<sycl::bundle_state::object>(Ctx, {KernelID1});
180204

181-
// Prg1.build_with_kernel_type<CacheTestKernel>();
182-
// Prg2.build_with_kernel_type<CacheTestKernel>();
183205
auto CtxImpl = detail::getSyclObjImpl(Ctx);
184206
detail::KernelProgramCache::ProgramCacheT &Cache =
185207
CtxImpl->getKernelProgramCache().acquireCachedPrograms().get();
186-
EXPECT_EQ(Cache.size(), 1U) << "Expect non-empty cache for programs";
208+
209+
EXPECT_EQ(Cache.size(), 0U)
210+
<< "Expect empty cache for kernel_bundles build with object_state.";
211+
}
212+
213+
// Check that kernel_bundles with executable_state are cached.
214+
TEST_F(KernelAndProgramCacheTest, KernelBundleExecutableState) {
215+
std::vector<sycl::device> Devices = Plt.get_devices();
216+
sycl::context Ctx(Devices[0]);
217+
218+
auto KernelID1 = sycl::get_kernel_id<CacheTestKernel>();
219+
auto KernelID2 = sycl::get_kernel_id<CacheTestKernel2>();
220+
sycl::kernel_bundle KernelBundle1 =
221+
sycl::get_kernel_bundle<sycl::bundle_state::executable>(Ctx, {KernelID1});
222+
sycl::kernel_bundle KernelBundle2 =
223+
sycl::get_kernel_bundle<sycl::bundle_state::executable>(Ctx, {KernelID2});
224+
225+
auto CtxImpl = detail::getSyclObjImpl(Ctx);
226+
detail::KernelProgramCache::ProgramCacheT &Cache =
227+
CtxImpl->getKernelProgramCache().acquireCachedPrograms().get();
228+
229+
EXPECT_EQ(Cache.size(), 1U)
230+
<< "Expect non-empty cache for kernel_bundles with executable_state.";
231+
}
232+
233+
// Check that kernel_bundle built with specialization constants are cached.
234+
TEST_F(KernelAndProgramCacheTest, SpecConstantCacheNegative) {
235+
std::vector<sycl::device> Devices = Plt.get_devices();
236+
sycl::context Ctx(Devices[0]);
237+
238+
auto KernelID1 = sycl::get_kernel_id<CacheTestKernel>();
239+
auto KernelID2 = sycl::get_kernel_id<CacheTestKernel2>();
240+
241+
sycl::kernel_bundle KernelBundle1 =
242+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {KernelID1});
243+
KernelBundle1.set_specialization_constant<SpecConst1>(80);
244+
sycl::build(KernelBundle1);
245+
EXPECT_EQ(KernelBundle1.get_specialization_constant<SpecConst1>(), 80)
246+
<< "Wrong specialization constant";
247+
248+
sycl::kernel_bundle KernelBundle2 =
249+
sycl::get_kernel_bundle<sycl::bundle_state::input>(Ctx, {KernelID2});
250+
KernelBundle2.set_specialization_constant<SpecConst1>(70);
251+
sycl::build(KernelBundle2);
252+
EXPECT_EQ(KernelBundle2.get_specialization_constant<SpecConst1>(), 70)
253+
<< "Wrong specialization constant";
254+
255+
auto CtxImpl = detail::getSyclObjImpl(Ctx);
256+
detail::KernelProgramCache::ProgramCacheT &Cache =
257+
CtxImpl->getKernelProgramCache().acquireCachedPrograms().get();
258+
259+
EXPECT_EQ(Cache.size(), 1U) << "Expect non-empty cache";
260+
}
261+
262+
// Check that kernel_bundle created through join() is not cached.
263+
TEST_F(KernelAndProgramCacheTest, KernelBundleJoin) {
264+
std::vector<sycl::device> Devices = Plt.get_devices();
265+
sycl::context Ctx(Devices[0]);
266+
267+
auto KernelID1 = sycl::get_kernel_id<CacheTestKernel>();
268+
auto KernelID2 = sycl::get_kernel_id<CacheTestKernel2>();
269+
sycl::kernel_bundle KernelBundle1 =
270+
sycl::get_kernel_bundle<sycl::bundle_state::executable>(Ctx, {KernelID1});
271+
sycl::kernel_bundle KernelBundle2 =
272+
sycl::get_kernel_bundle<sycl::bundle_state::executable>(Ctx, {KernelID2});
273+
274+
std::vector<kernel_bundle<sycl::bundle_state::executable>>
275+
KernelBundles {KernelBundle1, KernelBundle2};
276+
sycl::kernel_bundle KernelBundle3 = sycl::join(KernelBundles);
277+
278+
auto CtxImpl = detail::getSyclObjImpl(Ctx);
279+
detail::KernelProgramCache::ProgramCacheT &Cache =
280+
CtxImpl->getKernelProgramCache().acquireCachedPrograms().get();
281+
282+
EXPECT_EQ(Cache.size(), 1U)
283+
<< "Expect no caching for kennel_bundle created via join.";
187284
}
188285

189286
// Check that programs built with options are cached.
@@ -304,27 +401,6 @@ TEST_F(KernelAndProgramCacheTest, DISABLED_KernelNegativeLinkOpts) {
304401
EXPECT_EQ(Cache.size(), 0U) << "Expect empty cache for kernels";
305402
}
306403

307-
// Check that kernels are not cached if program is created from multiple
308-
// programs.
309-
TEST_F(KernelAndProgramCacheTest, DISABLED_KernelNegativeLinkedProgs) {
310-
context Ctx{Plt};
311-
auto CtxImpl = detail::getSyclObjImpl(Ctx);
312-
313-
globalCtx.reset(new TestCtx{CtxImpl->getHandleRef()});
314-
315-
// program Prg1{Ctx};
316-
// program Prg2{Ctx};
317-
318-
// Prg1.compile_with_kernel_type<CacheTestKernel>();
319-
// Prg2.compile_with_kernel_type<CacheTestKernel2>();
320-
// program Prg({Prg1, Prg2});
321-
// kernel Ker = Prg.get_kernel<CacheTestKernel>();
322-
323-
detail::KernelProgramCache::KernelCacheT &Cache =
324-
CtxImpl->getKernelProgramCache().acquireKernelsPerProgramCache().get();
325-
EXPECT_EQ(Cache.size(), 0U) << "Expect empty cache for kernels";
326-
}
327-
328404
// Check that kernels created from source are not cached.
329405
TEST_F(KernelAndProgramCacheTest, DISABLED_KernelNegativeSource) {
330406
context Ctx{Plt};

0 commit comments

Comments
 (0)