Skip to content

Commit 0da6390

Browse files
Merge pull request #1589 from IntelPython/improve-coverage-sycl-interface
Improve coverage sycl interface
2 parents 933630a + bbb2d54 commit 0da6390

9 files changed

+156
-50
lines changed

libsyclinterface/dbg_build.sh

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ pushd build || exit 1
77
INSTALL_PREFIX=$(pwd)/../install
88
rm -rf ${INSTALL_PREFIX}
99

10+
# With DPC++ 2024.0 adn newer set these to ensure that
11+
# cmake can find llvm-cov and other utilities
12+
LLVM_TOOLS_HOME=${CMPLR_ROOT}/bin/compiler
13+
PATH=$PATH:${CMPLR_ROOT}/bin/compiler
14+
1015
cmake \
1116
-DCMAKE_BUILD_TYPE=Debug \
1217
-DCMAKE_C_COMPILER=icx \
@@ -16,13 +21,19 @@ cmake \
1621
-DCMAKE_PREFIX_PATH=${INSTALL_PREFIX} \
1722
-DDPCTL_ENABLE_L0_PROGRAM_CREATION=ON \
1823
-DDPCTL_BUILD_CAPI_TESTS=ON \
24+
-DDPCTL_GENERATE_COVERAGE=OFF \
1925
..
2026

21-
make V=1 -n -j 4 && make check && make install
27+
# build
28+
make V=1 -n -j 4
29+
# run ctest
30+
make check
31+
# install
32+
make install
2233

2334
# Turn on to generate coverage report html files reconfigure with
2435
# -DDPCTL_GENERATE_COVERAGE=ON and then
25-
# make lcov-genhtml
36+
# make llvm-cov-report
2637

2738
# For more verbose tests use:
2839
# cd tests

libsyclinterface/include/dpctl_sycl_queue_interface.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,18 @@ DPCTL_API
171171
__dpctl_give DPCTLSyclDeviceRef
172172
DPCTLQueue_GetDevice(__dpctl_keep const DPCTLSyclQueueRef QRef);
173173

174+
/*! @brief Structure to be used to specify dimensionality and type of
175+
* local_accessor kernel type argument.
176+
*/
177+
typedef struct MDLocalAccessorTy
178+
{
179+
size_t ndim;
180+
DPCTLKernelArgType dpctl_type_id;
181+
size_t dim0;
182+
size_t dim1;
183+
size_t dim2;
184+
} MDLocalAccessor;
185+
174186
/*!
175187
* @brief Submits the kernel to the specified queue with the provided range
176188
* argument.

libsyclinterface/source/dpctl_sycl_queue_interface.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,6 @@ typedef struct complex
121121
uint64_t imag;
122122
} complexNumber;
123123

124-
typedef struct MDLocalAccessorTy
125-
{
126-
size_t ndim;
127-
DPCTLKernelArgType dpctl_type_id;
128-
size_t dim0;
129-
size_t dim1;
130-
size_t dim2;
131-
} MDLocalAccessor;
132-
133124
void set_dependent_events(handler &cgh,
134125
__dpctl_keep const DPCTLSyclEventRef *DepEvents,
135126
size_t NDepEvents)

libsyclinterface/tests/CMakeLists.txt

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,35 @@ if(DPCTL_GENERATE_COVERAGE)
8989
${CMAKE_DL_LIBS}
9090
)
9191
set(object_arg "-object;")
92-
add_custom_target(llvm-cov
92+
add_custom_target(run-c-api-tests
9393
COMMAND ${CMAKE_COMMAND} -E env DPCTL_VERBOSITY=warning ${CMAKE_CURRENT_BINARY_DIR}/dpctl_c_api_tests
94+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
95+
COMMAND_EXPAND_LISTS
96+
DEPENDS dpctl_c_api_tests
97+
)
98+
add_custom_target(llvm-cov-show
99+
COMMAND ${LLVMProfdata_EXE}
100+
merge
101+
-sparse default.profraw
102+
-o
103+
dpctl.profdata
104+
COMMAND ${LLVMCov_EXE}
105+
export
106+
-format=lcov
107+
-ignore-filename-regex=/tmp/icpx*
108+
-instr-profile=dpctl.profdata
109+
"${object_arg}$<JOIN:$<TARGET_OBJECTS:DPCTLSyclInterface>,;${object_arg}>"
110+
> dpctl.lcov
111+
COMMAND ${LLVMCov_EXE}
112+
show
113+
-instr-profile=dpctl.profdata
114+
"${object_arg}$<JOIN:$<TARGET_OBJECTS:DPCTLSyclInterface>,;${object_arg}>"
115+
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
116+
COMMAND_EXPAND_LISTS
117+
DEPENDS run-c-api-tests
118+
)
119+
120+
add_custom_target(llvm-cov-report
94121
COMMAND ${LLVMProfdata_EXE}
95122
merge
96123
-sparse default.profraw
@@ -109,11 +136,10 @@ if(DPCTL_GENERATE_COVERAGE)
109136
"${object_arg}$<JOIN:$<TARGET_OBJECTS:DPCTLSyclInterface>,;${object_arg}>"
110137
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
111138
COMMAND_EXPAND_LISTS
112-
DEPENDS dpctl_c_api_tests
139+
DEPENDS run-c-api-tests
113140
)
114141

115142
add_custom_target(lcov-genhtml
116-
COMMAND ${CMAKE_COMMAND} -E env DPCTL_VERBOSITY=warning ${CMAKE_CURRENT_BINARY_DIR}/dpctl_c_api_tests
117143
COMMAND ${LLVMProfdata_EXE}
118144
merge
119145
-sparse default.profraw
@@ -132,7 +158,7 @@ if(DPCTL_GENERATE_COVERAGE)
132158
${COVERAGE_OUTPUT_DIR}/dpctl-c-api-coverage
133159
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
134160
COMMAND_EXPAND_LISTS
135-
DEPENDS dpctl_c_api_tests
161+
DEPENDS run-c-api-tests
136162
)
137163
else()
138164
target_link_libraries(dpctl_c_api_tests

libsyclinterface/tests/test_sycl_device_aspects.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ auto build_gtest_values(const std::array<std::pair<T1, T2>, N> &params)
9797
auto build_params()
9898
{
9999
constexpr auto param_1 = get_param_list<const char *>(
100-
"opencl:gpu", "opencl:cpu", "level_zero:gpu", "host");
100+
"opencl:gpu", "opencl:cpu", "level_zero:gpu");
101101

102102
constexpr auto param_2 =
103103
get_param_list<std::pair<const char *, sycl::aspect>>(

libsyclinterface/tests/test_sycl_queue_interface.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,34 @@ struct TestDPCTLQueueMemberFunctions
9090

9191
} /* End of anonymous namespace */
9292

93+
TEST(TestDPCTLSyclQueueInterface, CheckCreate)
94+
{
95+
/* We are testing that we do not crash even when input is NULL. */
96+
DPCTLSyclQueueRef QRef = nullptr;
97+
98+
EXPECT_NO_FATAL_FAILURE(
99+
QRef = DPCTLQueue_Create(nullptr, nullptr, nullptr, 0));
100+
ASSERT_TRUE(QRef == nullptr);
101+
}
102+
103+
TEST(TestDPCTLSyclQueueInterface, CheckCreate2)
104+
{
105+
/* We are testing that we do not crash even when input is NULL. */
106+
DPCTLSyclQueueRef QRef = nullptr;
107+
DPCTLSyclDeviceSelectorRef DSRef = nullptr;
108+
DPCTLSyclDeviceRef DRef = nullptr;
109+
110+
EXPECT_NO_FATAL_FAILURE(DSRef = DPCTLDefaultSelector_Create());
111+
EXPECT_NO_FATAL_FAILURE(DRef = DPCTLDevice_CreateFromSelector(DSRef));
112+
EXPECT_NO_FATAL_FAILURE(DPCTLDeviceSelector_Delete(DSRef));
113+
114+
EXPECT_NO_FATAL_FAILURE(QRef =
115+
DPCTLQueue_Create(nullptr, DRef, nullptr, 0));
116+
ASSERT_TRUE(QRef == nullptr);
117+
118+
EXPECT_NO_FATAL_FAILURE(DPCTLDevice_Delete(DRef));
119+
}
120+
93121
TEST(TestDPCTLSyclQueueInterface, CheckCreateForDevice)
94122
{
95123
/* We are testing that we do not crash even when input is NULL. */

libsyclinterface/tests/test_sycl_queue_submit.cpp

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ void submit_kernel(DPCTLSyclQueueRef QRef,
5656
{
5757
T scalarVal = 3;
5858
constexpr size_t NARGS = 4;
59-
constexpr size_t RANGE_NDIMS = 1;
59+
constexpr size_t RANGE_NDIMS_1 = 1;
60+
constexpr size_t RANGE_NDIMS_2 = 2;
61+
constexpr size_t RANGE_NDIMS_3 = 3;
6062

6163
ASSERT_TRUE(DPCTLKernelBundle_HasKernel(KBRef, kernelName.c_str()));
6264
auto kernel = DPCTLKernelBundle_GetKernel(KBRef, kernelName.c_str());
@@ -75,13 +77,33 @@ void submit_kernel(DPCTLSyclQueueRef QRef,
7577
(void *)&scalarVal};
7678
DPCTLKernelArgType addKernelArgTypes[] = {DPCTL_VOID_PTR, DPCTL_VOID_PTR,
7779
DPCTL_VOID_PTR, kernelArgTy};
78-
auto ERef = DPCTLQueue_SubmitRange(kernel, QRef, args, addKernelArgTypes,
79-
NARGS, Range, RANGE_NDIMS, nullptr, 0);
80-
ASSERT_TRUE(ERef != nullptr);
81-
DPCTLQueue_Wait(QRef);
80+
auto E1Ref =
81+
DPCTLQueue_SubmitRange(kernel, QRef, args, addKernelArgTypes, NARGS,
82+
Range, RANGE_NDIMS_1, nullptr, 0);
83+
ASSERT_TRUE(E1Ref != nullptr);
84+
85+
// Create kernel args for vector_add
86+
size_t Range2D[] = {SIZE, 1};
87+
DPCTLSyclEventRef DepEvs[] = {E1Ref};
88+
auto E2Ref =
89+
DPCTLQueue_SubmitRange(kernel, QRef, args, addKernelArgTypes, NARGS,
90+
Range2D, RANGE_NDIMS_2, DepEvs, 1);
91+
ASSERT_TRUE(E2Ref != nullptr);
92+
93+
// Create kernel args for vector_add
94+
size_t Range3D[] = {SIZE, 1, 1};
95+
DPCTLSyclEventRef DepEvs2[] = {E1Ref, E2Ref};
96+
auto E3Ref =
97+
DPCTLQueue_SubmitRange(kernel, QRef, args, addKernelArgTypes, NARGS,
98+
Range3D, RANGE_NDIMS_3, DepEvs2, 2);
99+
ASSERT_TRUE(E3Ref != nullptr);
100+
101+
DPCTLEvent_Wait(E3Ref);
82102

83103
// clean ups
84-
DPCTLEvent_Delete(ERef);
104+
DPCTLEvent_Delete(E1Ref);
105+
DPCTLEvent_Delete(E2Ref);
106+
DPCTLEvent_Delete(E3Ref);
85107
DPCTLKernel_Delete(kernel);
86108
DPCTLfree_with_queue((DPCTLSyclUSMRef)a, QRef);
87109
DPCTLfree_with_queue((DPCTLSyclUSMRef)b, QRef);
@@ -234,13 +256,13 @@ struct TestQueueSubmitFP64 : public ::testing::Test
234256
std::ifstream spirvFile;
235257
size_t spirvFileSize_;
236258
std::vector<char> spirvBuffer_;
259+
DPCTLSyclDeviceRef DRef = nullptr;
237260
DPCTLSyclQueueRef QRef = nullptr;
238261
DPCTLSyclKernelBundleRef KBRef = nullptr;
239262

240263
TestQueueSubmitFP64()
241264
{
242265
DPCTLSyclDeviceSelectorRef DSRef = nullptr;
243-
DPCTLSyclDeviceRef DRef = nullptr;
244266

245267
spirvFile.open("./oneD_range_kernel_fp64.spv",
246268
std::ios::binary | std::ios::ate);
@@ -257,13 +279,13 @@ struct TestQueueSubmitFP64 : public ::testing::Test
257279

258280
KBRef = DPCTLKernelBundle_CreateFromSpirv(
259281
CRef, DRef, spirvBuffer_.data(), spirvFileSize_, nullptr);
260-
DPCTLDevice_Delete(DRef);
261282
DPCTLDeviceSelector_Delete(DSRef);
262283
}
263284

264285
~TestQueueSubmitFP64()
265286
{
266287
spirvFile.close();
288+
DPCTLDevice_Delete(DRef);
267289
DPCTLQueue_Delete(QRef);
268290
DPCTLKernelBundle_Delete(KBRef);
269291
}
@@ -334,9 +356,11 @@ TEST_F(TestQueueSubmit, CheckForFloat)
334356

335357
TEST_F(TestQueueSubmitFP64, CheckForDouble)
336358
{
337-
submit_kernel<double>(QRef, KBRef, spirvBuffer_, spirvFileSize_,
338-
DPCTLKernelArgType::DPCTL_FLOAT64_T,
339-
"_ZTS11RangeKernelIdE");
359+
if (DPCTLDevice_HasAspect(DRef, DPCTLSyclAspectType::fp64)) {
360+
submit_kernel<double>(QRef, KBRef, spirvBuffer_, spirvFileSize_,
361+
DPCTLKernelArgType::DPCTL_FLOAT64_T,
362+
"_ZTS11RangeKernelIdE");
363+
}
340364
}
341365

342366
TEST_F(TestQueueSubmit, CheckForUnsupportedArgTy)

libsyclinterface/tests/test_sycl_queue_submit_local_accessor_arg.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,6 @@ constexpr size_t SIZE = 100;
4444

4545
using namespace dpctl::syclinterface;
4646

47-
typedef struct MDLocalAccessorTy
48-
{
49-
size_t ndim;
50-
DPCTLKernelArgType dpctl_type_id;
51-
size_t dim0;
52-
size_t dim1;
53-
size_t dim2;
54-
} MDLocalAccessor;
55-
5647
template <typename T>
5748
void submit_kernel(DPCTLSyclQueueRef QRef,
5849
DPCTLSyclKernelBundleRef KBRef,
@@ -75,28 +66,49 @@ void submit_kernel(DPCTLSyclQueueRef QRef,
7566
a_ptr[i] = 0;
7667
}
7768

78-
auto la = MDLocalAccessor{1, kernelArgTy, SIZE / 10, 1, 1};
69+
auto la1 = MDLocalAccessor{1, kernelArgTy, SIZE / 10, 1, 1};
7970

8071
// Create kernel args for vector_add
8172
size_t gRange[] = {SIZE};
8273
size_t lRange[] = {SIZE / 10};
83-
void *args[NARGS] = {unwrap<void>(a), (void *)&la};
74+
void *args_1d[NARGS] = {unwrap<void>(a), (void *)&la1};
8475
DPCTLKernelArgType addKernelArgTypes[] = {DPCTL_VOID_PTR,
8576
DPCTL_LOCAL_ACCESSOR};
8677

87-
auto ERef =
88-
DPCTLQueue_SubmitNDRange(kernel, QRef, args, addKernelArgTypes, NARGS,
89-
gRange, lRange, RANGE_NDIMS, nullptr, 0);
90-
ASSERT_TRUE(ERef != nullptr);
91-
DPCTLQueue_Wait(QRef);
78+
DPCTLSyclEventRef E1Ref = DPCTLQueue_SubmitNDRange(
79+
kernel, QRef, args_1d, addKernelArgTypes, NARGS, gRange, lRange,
80+
RANGE_NDIMS, nullptr, 0);
81+
ASSERT_TRUE(E1Ref != nullptr);
82+
83+
DPCTLSyclEventRef DepEv1[] = {E1Ref};
84+
auto la2 = MDLocalAccessor{2, kernelArgTy, SIZE / 10, 1, 1};
85+
void *args_2d[NARGS] = {unwrap<void>(a), (void *)&la2};
86+
87+
DPCTLSyclEventRef E2Ref =
88+
DPCTLQueue_SubmitNDRange(kernel, QRef, args_2d, addKernelArgTypes,
89+
NARGS, gRange, lRange, RANGE_NDIMS, DepEv1, 1);
90+
ASSERT_TRUE(E2Ref != nullptr);
91+
92+
DPCTLSyclEventRef DepEv2[] = {E1Ref, E2Ref};
93+
auto la3 = MDLocalAccessor{3, kernelArgTy, SIZE / 10, 1, 1};
94+
void *args_3d[NARGS] = {unwrap<void>(a), (void *)&la3};
95+
96+
DPCTLSyclEventRef E3Ref =
97+
DPCTLQueue_SubmitNDRange(kernel, QRef, args_3d, addKernelArgTypes,
98+
NARGS, gRange, lRange, RANGE_NDIMS, DepEv2, 2);
99+
ASSERT_TRUE(E3Ref != nullptr);
100+
101+
DPCTLEvent_Wait(E3Ref);
92102

93103
if (kernelArgTy != DPCTL_FLOAT32_T && kernelArgTy != DPCTL_FLOAT64_T)
94104
ASSERT_TRUE(a_ptr[0] == 20);
95105
else
96106
ASSERT_TRUE(a_ptr[0] == 20.0);
97107

98108
// clean ups
99-
DPCTLEvent_Delete(ERef);
109+
DPCTLEvent_Delete(E1Ref);
110+
DPCTLEvent_Delete(E2Ref);
111+
DPCTLEvent_Delete(E3Ref);
100112
DPCTLKernel_Delete(kernel);
101113
DPCTLfree_with_queue((DPCTLSyclUSMRef)a, QRef);
102114
}
@@ -239,13 +251,13 @@ struct TestQueueSubmitWithLocalAccessorFP64 : public ::testing::Test
239251
std::ifstream spirvFile;
240252
size_t spirvFileSize_;
241253
std::vector<char> spirvBuffer_;
254+
DPCTLSyclDeviceRef DRef = nullptr;
242255
DPCTLSyclQueueRef QRef = nullptr;
243256
DPCTLSyclKernelBundleRef KBRef = nullptr;
244257

245258
TestQueueSubmitWithLocalAccessorFP64()
246259
{
247260
DPCTLSyclDeviceSelectorRef DSRef = nullptr;
248-
DPCTLSyclDeviceRef DRef = nullptr;
249261

250262
spirvFile.open("./local_accessor_kernel_fp64.spv",
251263
std::ios::binary | std::ios::ate);
@@ -262,13 +274,13 @@ struct TestQueueSubmitWithLocalAccessorFP64 : public ::testing::Test
262274

263275
KBRef = DPCTLKernelBundle_CreateFromSpirv(
264276
CRef, DRef, spirvBuffer_.data(), spirvFileSize_, nullptr);
265-
DPCTLDevice_Delete(DRef);
266277
DPCTLDeviceSelector_Delete(DSRef);
267278
}
268279

269280
~TestQueueSubmitWithLocalAccessorFP64()
270281
{
271282
spirvFile.close();
283+
DPCTLDevice_Delete(DRef);
272284
DPCTLQueue_Delete(QRef);
273285
DPCTLKernelBundle_Delete(KBRef);
274286
}
@@ -339,9 +351,11 @@ TEST_F(TestQueueSubmitWithLocalAccessor, CheckForFloat)
339351

340352
TEST_F(TestQueueSubmitWithLocalAccessorFP64, CheckForDouble)
341353
{
342-
submit_kernel<double>(QRef, KBRef, spirvBuffer_, spirvFileSize_,
343-
DPCTLKernelArgType::DPCTL_FLOAT64_T,
344-
"_ZTS14SyclKernel_SLMIdE");
354+
if (DPCTLDevice_HasAspect(DRef, DPCTLSyclAspectType::fp64)) {
355+
submit_kernel<double>(QRef, KBRef, spirvBuffer_, spirvFileSize_,
356+
DPCTLKernelArgType::DPCTL_FLOAT64_T,
357+
"_ZTS14SyclKernel_SLMIdE");
358+
}
345359
}
346360

347361
TEST_F(TestQueueSubmitWithLocalAccessor, CheckForUnsupportedArgTy)

scripts/gen_coverage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def run(
8282
.strip("\n")
8383
)
8484
subprocess.check_call(
85-
["cmake", "--build", ".", "--target", "llvm-cov"],
85+
["cmake", "--build", ".", "--target", "llvm-cov-report"],
8686
cwd=cmake_build_dir,
8787
)
8888
env["LLVM_PROFILE_FILE"] = "dpctl_pytest.profraw"

0 commit comments

Comments
 (0)