Skip to content

Commit 5ef40f9

Browse files
committed
Enable IPC tests for Level Zero provider
1 parent ac2ae9e commit 5ef40f9

File tree

3 files changed

+334
-190
lines changed

3 files changed

+334
-190
lines changed

test/ipcAPI.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ struct provider_mock_ipc : public umf_test::provider_base_t {
109109
static umf_memory_provider_ops_t IPC_MOCK_PROVIDER_OPS =
110110
umf::providerMakeCOps<provider_mock_ipc, void>();
111111

112+
HostMemoryAccessor hostMemoryAccessor;
113+
112114
INSTANTIATE_TEST_SUITE_P(umfIpcTestSuite, umfIpcTest,
113-
::testing::Values(testParams{
115+
::testing::Values(ipcTestParams{
114116
umfProxyPoolOps(), nullptr, &IPC_MOCK_PROVIDER_OPS,
115-
nullptr}));
117+
nullptr, &hostMemoryAccessor}));

test/ipcFixtures.hpp

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,39 @@
1919
#include <numeric>
2020
#include <tuple>
2121

22-
using testParams = std::tuple<umf_memory_pool_ops_t *, void *,
23-
umf_memory_provider_ops_t *, void *>;
22+
class MemoryAccessor {
23+
public:
24+
virtual void fill(void *ptr, size_t size, const void *pattern,
25+
size_t pattern_size) = 0;
26+
virtual void copy(void *dst_ptr, void *src_ptr, size_t size) = 0;
27+
};
28+
29+
class HostMemoryAccessor : public MemoryAccessor {
30+
public:
31+
void fill(void *ptr, size_t size, const void *pattern,
32+
size_t pattern_size) override {
33+
assert(ptr != nullptr);
34+
assert(pattern != nullptr);
35+
assert(pattern_size > 0);
36+
while (size) {
37+
size_t copy_size = std::min(size, pattern_size);
38+
std::memcpy(ptr, pattern, copy_size);
39+
ptr = static_cast<char *>(ptr) + copy_size;
40+
size -= copy_size;
41+
}
42+
}
43+
44+
void copy(void *dst_ptr, void *src_ptr, size_t size) override {
45+
std::memcpy(dst_ptr, src_ptr, size);
46+
}
47+
};
2448

25-
struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
49+
using ipcTestParams =
50+
std::tuple<umf_memory_pool_ops_t *, void *, umf_memory_provider_ops_t *,
51+
void *, MemoryAccessor *>;
52+
53+
struct umfIpcTest : umf_test::test,
54+
::testing::WithParamInterface<ipcTestParams> {
2655
umfIpcTest() : pool(nullptr, nullptr) {}
2756
void SetUp() override {
2857
test::SetUp();
@@ -36,7 +65,7 @@ struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
3665
// from memoryPool.hpp
3766
umf_memory_provider_handle_t hProvider;
3867
umf_memory_pool_handle_t hPool;
39-
auto [pool_ops, pool_params, provider_ops, provider_params] =
68+
auto [pool_ops, pool_params, provider_ops, provider_params, accessor] =
4069
this->GetParam();
4170

4271
auto ret =
@@ -63,6 +92,8 @@ struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
6392
UMF_POOL_CREATE_FLAG_OWN_PROVIDER, &hPool);
6493
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
6594

95+
memAccessor = accessor;
96+
6697
return umf::pool_unique_handle_t(hPool, &umfPoolDestroy);
6798
}
6899

@@ -78,14 +109,17 @@ struct umfIpcTest : umf_test::test, ::testing::WithParamInterface<testParams> {
78109
umf::pool_unique_handle_t pool;
79110
static constexpr int NTHREADS = 10;
80111
stats_type stat;
112+
MemoryAccessor *memAccessor = nullptr;
81113
};
82114

83115
TEST_P(umfIpcTest, BasicFlow) {
84116
constexpr size_t SIZE = 100;
117+
std::vector<int> expected_data(SIZE);
85118
int *ptr = (int *)umfPoolMalloc(pool.get(), SIZE * sizeof(int));
86119
EXPECT_NE(ptr, nullptr);
87120

88-
std::iota(ptr, ptr + SIZE, 0);
121+
std::iota(expected_data.begin(), expected_data.end(), 0);
122+
memAccessor->copy(ptr, expected_data.data(), SIZE * sizeof(int));
89123

90124
umf_ipc_handle_t ipcHandleFull = nullptr;
91125
size_t handleFullSize = 0;
@@ -105,16 +139,20 @@ TEST_P(umfIpcTest, BasicFlow) {
105139
ret = umfOpenIPCHandle(pool.get(), ipcHandleHalf, &halfArray);
106140
ASSERT_EQ(ret, UMF_RESULT_SUCCESS);
107141

108-
for (int i = 0; i < (int)SIZE; ++i) {
109-
ASSERT_EQ(reinterpret_cast<int *>(fullArray)[i], i);
110-
}
142+
std::vector<int> actual_data(SIZE);
143+
memAccessor->copy(actual_data.data(), fullArray, SIZE * sizeof(int));
144+
ASSERT_TRUE(std::equal(expected_data.begin(), expected_data.end(),
145+
actual_data.begin()));
146+
111147
// Close fullArray before reading halfArray
112148
ret = umfCloseIPCHandle(fullArray);
113149
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
114150

115-
for (int i = 0; i < (int)SIZE / 2; ++i) {
116-
ASSERT_EQ(reinterpret_cast<int *>(halfArray)[i], i + SIZE / 2);
117-
}
151+
actual_data.resize(SIZE / 2);
152+
memAccessor->copy(actual_data.data(), halfArray, SIZE / 2 * sizeof(int));
153+
ASSERT_TRUE(std::equal(expected_data.begin() + SIZE / 2,
154+
expected_data.end(), actual_data.begin()));
155+
118156
ret = umfCloseIPCHandle(halfArray);
119157
EXPECT_EQ(ret, UMF_RESULT_SUCCESS);
120158

0 commit comments

Comments
 (0)