7
7
#include < uur/fixtures.h>
8
8
#include < uur/known_failure.h>
9
9
10
- struct urEventWaitTest : uur::urQueueTest {
10
+ struct urEventWaitTest : uur::urDeviceTest {
11
11
void SetUp () override {
12
- UUR_RETURN_ON_FATAL_FAILURE (urQueueTest::SetUp ());
13
- ASSERT_SUCCESS (urMemBufferCreate (context, UR_MEM_FLAG_READ_ONLY, size,
14
- nullptr , &src_buffer));
15
- ASSERT_SUCCESS (urMemBufferCreate (context, UR_MEM_FLAG_WRITE_ONLY, size,
16
- nullptr , &dst_buffer));
17
- input.assign (count, 42 );
18
- ASSERT_SUCCESS (urEnqueueMemBufferWrite (queue, src_buffer, false , 0 , size,
19
- input.data (), 0 , nullptr , &event));
20
- ASSERT_SUCCESS (urEventWait (1 , &event));
12
+ UUR_RETURN_ON_FATAL_FAILURE (urDeviceTest::SetUp ());
13
+
14
+ for (size_t i = 0 ; i < maxNumContexts; ++i) {
15
+ ur_context_handle_t context = nullptr ;
16
+ ASSERT_SUCCESS (urContextCreate (1 , &device, nullptr , &context));
17
+ ASSERT_NE (context, nullptr );
18
+ contexts.push_back (context);
19
+
20
+ ur_queue_handle_t queue = nullptr ;
21
+ ASSERT_SUCCESS (urQueueCreate (context, device, 0 , &queue));
22
+ ASSERT_NE (queue, nullptr );
23
+ queues.push_back (queue);
24
+
25
+ src_buffer.emplace_back ();
26
+ dst_buffer.emplace_back ();
27
+
28
+ ASSERT_SUCCESS (urMemBufferCreate (context, UR_MEM_FLAG_READ_WRITE, size,
29
+ nullptr , &src_buffer[i]));
30
+ ASSERT_SUCCESS (urMemBufferCreate (context, UR_MEM_FLAG_READ_WRITE, size,
31
+ nullptr , &dst_buffer[i]));
32
+ input.emplace_back ();
33
+ input[i].assign (count, uint32_t (99 + i));
34
+ ASSERT_SUCCESS (urEnqueueMemBufferWrite (queue, src_buffer[i], true , 0 ,
35
+ size, input[i].data (), 0 , nullptr ,
36
+ nullptr ));
37
+ }
21
38
}
22
39
23
40
void TearDown () override {
24
- if (src_buffer) {
25
- EXPECT_SUCCESS (urMemRelease (src_buffer));
41
+ for (size_t i = 0 ; i < src_buffer.size (); ++i) {
42
+ EXPECT_SUCCESS (urMemRelease (src_buffer[i]));
43
+ EXPECT_SUCCESS (urMemRelease (dst_buffer[i]));
26
44
}
27
- if (dst_buffer ) {
28
- EXPECT_SUCCESS (urMemRelease (dst_buffer ));
45
+ for ( size_t i = 0 ; i < queues. size (); ++i ) {
46
+ EXPECT_SUCCESS (urQueueRelease (queues[i] ));
29
47
}
30
- if (event ) {
31
- EXPECT_SUCCESS (urEventRelease (event ));
48
+ for ( size_t i = 0 ; i < contexts. size (); ++i ) {
49
+ EXPECT_SUCCESS (urContextRelease (contexts[i] ));
32
50
}
33
- urQueueTest ::TearDown ();
51
+ UUR_RETURN_ON_FATAL_FAILURE ( urDeviceTest ::TearDown () );
34
52
}
35
53
54
+ const size_t maxNumContexts = 5 ;
55
+ std::vector<ur_context_handle_t > contexts;
56
+ std::vector<ur_queue_handle_t > queues;
57
+ std::vector<ur_mem_handle_t > src_buffer;
58
+ std::vector<ur_mem_handle_t > dst_buffer;
36
59
const size_t count = 1024 ;
37
60
const size_t size = sizeof (uint32_t ) * count;
38
- ur_mem_handle_t src_buffer = nullptr ;
39
- ur_mem_handle_t dst_buffer = nullptr ;
40
- ur_event_handle_t event = nullptr ;
41
- std::vector<uint32_t > input;
61
+ std::vector<std::vector<uint32_t >> input;
42
62
};
63
+
43
64
UUR_INSTANTIATE_DEVICE_TEST_SUITE (urEventWaitTest);
44
65
45
66
TEST_P (urEventWaitTest, Success) {
46
67
UUR_KNOWN_FAILURE_ON (uur::NativeCPU{});
47
68
48
69
ur_event_handle_t event1 = nullptr ;
49
- ASSERT_SUCCESS (urEnqueueMemBufferCopy (queue , src_buffer, dst_buffer, 0 , 0 ,
50
- size, 0 , nullptr , &event1));
70
+ ASSERT_SUCCESS (urEnqueueMemBufferCopy (queues[ 0 ] , src_buffer[ 0 ] , dst_buffer[ 0 ] ,
71
+ 0 , 0 , size, 0 , nullptr , &event1));
51
72
std::vector<uint32_t > output (count, 1 );
52
73
ur_event_handle_t event2 = nullptr ;
53
- ASSERT_SUCCESS (urEnqueueMemBufferRead (queue, dst_buffer, false , 0 , size,
54
- output.data (), 0 , nullptr , &event2));
74
+ ASSERT_SUCCESS (urEnqueueMemBufferRead (queues[0 ], dst_buffer[0 ], false , 0 ,
75
+ size, output.data (), 0 , nullptr ,
76
+ &event2));
55
77
std::vector<ur_event_handle_t > events{event1, event2};
56
- EXPECT_SUCCESS (urQueueFlush (queue ));
78
+ EXPECT_SUCCESS (urQueueFlush (queues[ 0 ] ));
57
79
ASSERT_SUCCESS (
58
80
urEventWait (static_cast <uint32_t >(events.size ()), events.data ()));
59
- ASSERT_EQ (input, output);
81
+ ASSERT_EQ (input[ 0 ] , output);
60
82
61
83
EXPECT_SUCCESS (urEventRelease (event1));
62
84
EXPECT_SUCCESS (urEventRelease (event2));
@@ -75,3 +97,71 @@ TEST_P(urEventWaitNegativeTest, InvalidNullPointerEventList) {
75
97
ASSERT_EQ_RESULT (UR_RESULT_ERROR_INVALID_NULL_POINTER,
76
98
urEventWait (1 , nullptr ));
77
99
}
100
+
101
+ TEST_P (urEventWaitTest, WaitWithMultipleContexts) {
102
+ UUR_KNOWN_FAILURE_ON (uur::NativeCPU{});
103
+
104
+ for (size_t i = 0 ; i < maxNumContexts; i++) {
105
+ ASSERT_SUCCESS (urEnqueueMemBufferCopy (queues[i], src_buffer[i],
106
+ dst_buffer[i], 0 , 0 , size, 0 , nullptr ,
107
+ nullptr ));
108
+ }
109
+
110
+ std::vector<ur_event_handle_t > events;
111
+ std::vector<std::vector<uint32_t >> output;
112
+ for (size_t i = 0 ; i < maxNumContexts; i++) {
113
+ output.emplace_back (count, 1 );
114
+ events.emplace_back ();
115
+ ASSERT_SUCCESS (urEnqueueMemBufferRead (queues[i], dst_buffer[i], false , 0 ,
116
+ size, output[i].data (), 0 , nullptr ,
117
+ &events.back ()));
118
+ }
119
+
120
+ ASSERT_SUCCESS (
121
+ urEventWait (static_cast <uint32_t >(events.size ()), events.data ()));
122
+
123
+ for (size_t i = 0 ; i < maxNumContexts; i++) {
124
+ ASSERT_EQ (input[i], output[i]);
125
+ }
126
+
127
+ for (auto &event : events) {
128
+ EXPECT_SUCCESS (urEventRelease (event));
129
+ }
130
+ }
131
+
132
+ TEST_P (urEventWaitTest, WithCrossContextDependencies) {
133
+ // OpenCL: https://github.com/intel/llvm/issues/18765
134
+ UUR_KNOWN_FAILURE_ON (uur::NativeCPU{}, uur::OpenCL{});
135
+
136
+ std::vector<uint32_t > output (count, 1 );
137
+
138
+ std::vector<ur_event_handle_t > events;
139
+ for (size_t i = 0 ; i < maxNumContexts - 1 ; i++) {
140
+ auto waitEvent = events.size () ? &events.back () : nullptr ;
141
+ ur_event_handle_t event = nullptr ;
142
+ ASSERT_SUCCESS (
143
+ urEnqueueMemBufferCopy (queues[i], src_buffer[i], src_buffer[i + 1 ], 0 ,
144
+ 0 , size, waitEvent ? 1 : 0 , waitEvent, &event));
145
+ events.push_back (event);
146
+ }
147
+
148
+ ur_event_handle_t event1 = nullptr ;
149
+ ASSERT_SUCCESS (urEnqueueMemBufferCopy (queues.back (), src_buffer.back (),
150
+ dst_buffer.back (), 0 , 0 , size, 1 ,
151
+ &events.back (), &event1));
152
+
153
+ ur_event_handle_t event2 = nullptr ;
154
+ ASSERT_SUCCESS (urEnqueueMemBufferRead (queues.back (), dst_buffer.back (), false ,
155
+ 0 , size, output.data (), 0 , nullptr ,
156
+ &event2));
157
+
158
+ events.push_back (event1);
159
+ events.push_back (event2);
160
+
161
+ ASSERT_SUCCESS (
162
+ urEventWait (static_cast <uint32_t >(events.size ()), events.data ()));
163
+ ASSERT_EQ (input.front (), output);
164
+
165
+ EXPECT_SUCCESS (urEventRelease (event1));
166
+ EXPECT_SUCCESS (urEventRelease (event2));
167
+ }
0 commit comments