| //===-- Integration test for the lock-free buffer -------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "src/__support/GPU/fixedbuffer.h" | |
| #include "src/__support/GPU/utils.h" | |
| #include "test/IntegrationTest/test.h" | |
| using namespace LIBC_NAMESPACE; | |
| static FixedBuffer<uint32_t, 2048> global_buffer; | |
| void run() { | |
| ASSERT_EQ(gpu::get_num_blocks() * gpu::get_num_threads(), 512); | |
| uint32_t id = static_cast<uint32_t>(gpu::get_thread_id()) + 1; | |
| uint32_t val; | |
| auto valid = [](uint32_t v, uint32_t n) { | |
| return (v >= 1 && v <= n) || v == UINT32_MAX; | |
| }; | |
| for (int i = 0; i < 256; ++i) { | |
| EXPECT_TRUE(global_buffer.push(id)); | |
| EXPECT_TRUE(global_buffer.pop(val)); | |
| ASSERT_TRUE(valid(val, uint32_t(gpu::get_num_threads()))); | |
| } | |
| EXPECT_TRUE(global_buffer.push(id)); | |
| EXPECT_TRUE(global_buffer.push(id)); | |
| EXPECT_TRUE(global_buffer.pop(val)); | |
| ASSERT_TRUE(valid(val, uint32_t(gpu::get_num_threads()))); | |
| while (!global_buffer.push(UINT32_MAX)) | |
| ; | |
| } | |
| TEST_MAIN(int, char **, char **) { | |
| run(); | |
| return 0; | |
| } |