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,39 @@ 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, WithMultipleContexts) {
102
+ UUR_KNOWN_FAILURE_ON (uur::NativeCPU{});
103
+
104
+ std::vector<uint32_t > output (count, 1 );
105
+
106
+ std::vector<ur_event_handle_t > events;
107
+ for (size_t i = 0 ; i < maxNumContexts - 1 ; i++) {
108
+ auto waitEvent = events.size () ? &events.back () : nullptr ;
109
+ ur_event_handle_t event = nullptr ;
110
+ ASSERT_SUCCESS (
111
+ urEnqueueMemBufferCopy (queues[i], src_buffer[i], src_buffer[i + 1 ], 0 ,
112
+ 0 , size, waitEvent ? 1 : 0 , waitEvent, &event));
113
+ events.push_back (event);
114
+ }
115
+
116
+ ur_event_handle_t event1 = nullptr ;
117
+ ASSERT_SUCCESS (urEnqueueMemBufferCopy (queues.back (), src_buffer.back (),
118
+ dst_buffer.back (), 0 , 0 , size, 1 ,
119
+ &events.back (), &event1));
120
+
121
+ ur_event_handle_t event2 = nullptr ;
122
+ ASSERT_SUCCESS (urEnqueueMemBufferRead (queues.back (), dst_buffer.back (), false ,
123
+ 0 , size, output.data (), 0 , nullptr ,
124
+ &event2));
125
+
126
+ events.push_back (event1);
127
+ events.push_back (event2);
128
+
129
+ ASSERT_SUCCESS (
130
+ urEventWait (static_cast <uint32_t >(events.size ()), events.data ()));
131
+ ASSERT_EQ (input.front (), output);
132
+
133
+ EXPECT_SUCCESS (urEventRelease (event1));
134
+ EXPECT_SUCCESS (urEventRelease (event2));
135
+ }
0 commit comments