|
9 | 9 | #include "ck_tile/host/kernel_launch.hpp" |
10 | 10 | #include "ck_tile/core/utility/persistent_async_input_scheduler.hpp" |
11 | 11 |
|
| 12 | +#include <chrono> |
| 13 | +#include <thread> |
| 14 | + |
12 | 15 | using Row = ck_tile::tensor_layout::gemm::RowMajor; |
13 | 16 | using Col = ck_tile::tensor_layout::gemm::ColumnMajor; |
14 | 17 | using F16 = ck_tile::fp16_t; |
@@ -193,15 +196,33 @@ class TestGemmPersistentAsyncInput : public ::testing::Test |
193 | 196 | return; |
194 | 197 | } |
195 | 198 |
|
| 199 | + // Create a separate stream for setting signals |
| 200 | + // Using the same stream would deadlock - memcpy waits for kernel, kernel waits for signal |
| 201 | + hipStream_t signal_stream; |
| 202 | + HIP_CHECK_ERROR(hipStreamCreateWithFlags(&signal_stream, hipStreamNonBlocking)); |
| 203 | + |
196 | 204 | // Launch kernel |
197 | 205 | ck_tile::ignore = ck_tile::launch_kernel( |
198 | 206 | stream_cfg, |
199 | 207 | ck_tile::make_kernel<kBlockPerCu>(Kernel{}, grids, blocks, 0, kargs)); |
200 | 208 |
|
201 | | - // Simulate setting chunk signals (would normally be done by producer) |
202 | | - // For testing, we just set all signals to allow kernel completion |
203 | | - std::vector<uint32_t> host_signals(num_chunks, 1); |
204 | | - signal_buf.ToDevice(host_signals.data()); |
| 209 | + // Simulate producer setting chunk signals with interleaved sleep |
| 210 | + // This simulates async input becoming available over time |
| 211 | + const int sleep_us = 100; // microseconds between chunks |
| 212 | + for(ck_tile::index_t i = 0; i < num_chunks; ++i) |
| 213 | + { |
| 214 | + std::this_thread::sleep_for(std::chrono::microseconds(sleep_us)); |
| 215 | + const uint32_t signal_val = 1; |
| 216 | + HIP_CHECK_ERROR(hipMemcpyAsync(d_chunk_signals + i, |
| 217 | + &signal_val, |
| 218 | + sizeof(uint32_t), |
| 219 | + hipMemcpyHostToDevice, |
| 220 | + signal_stream)); |
| 221 | + } |
| 222 | + |
| 223 | + // Wait for all signals to be set |
| 224 | + HIP_CHECK_ERROR(hipStreamSynchronize(signal_stream)); |
| 225 | + HIP_CHECK_ERROR(hipStreamDestroy(signal_stream)); |
205 | 226 |
|
206 | 227 | // Wait for kernel completion |
207 | 228 | HIP_CHECK_ERROR(hipDeviceSynchronize()); |
|
0 commit comments