xref: /llvm-project/libc/test/integration/startup/gpu/rpc_stream_test.cpp (revision 89614ceb401711d2389bac838d0059c95eadcfff)
1d21e507cSJoseph Huber //===-- Loader test to check the RPC streaming interface with the loader --===//
2d21e507cSJoseph Huber //
3d21e507cSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d21e507cSJoseph Huber // See https://llvm.org/LICENSE.txt for license information.
5d21e507cSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d21e507cSJoseph Huber //
7d21e507cSJoseph Huber //===----------------------------------------------------------------------===//
8d21e507cSJoseph Huber 
973aab2f6Slntue #include "include/llvm-libc-types/test_rpc_opcodes_t.h"
10d21e507cSJoseph Huber #include "src/__support/GPU/utils.h"
11d21e507cSJoseph Huber #include "src/__support/RPC/rpc_client.h"
12d21e507cSJoseph Huber #include "src/__support/integer_to_string.h"
131f578347SGuillaume Chatelet #include "src/string/memory_utils/inline_memcmp.h"
141f578347SGuillaume Chatelet #include "src/string/memory_utils/inline_memcpy.h"
15d21e507cSJoseph Huber #include "src/string/string_utils.h"
16d21e507cSJoseph Huber #include "test/IntegrationTest/test.h"
17d21e507cSJoseph Huber 
18d21e507cSJoseph Huber extern "C" void *malloc(uint64_t);
19f6e5f90fSJoseph Huber extern "C" void free(void *);
20d21e507cSJoseph Huber 
21b6bc9d72SGuillaume Chatelet using namespace LIBC_NAMESPACE;
22d21e507cSJoseph Huber 
23d21e507cSJoseph Huber static void test_stream() {
2429d3da3bSJoseph Huber   static const char str[] =
2529d3da3bSJoseph Huber       "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy"
26d21e507cSJoseph Huber       "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy"
27d21e507cSJoseph Huber       "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy"
28d21e507cSJoseph Huber       "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy"
29d21e507cSJoseph Huber       "ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxy";
30d21e507cSJoseph Huber   uint64_t send_size = sizeof(str);
31d21e507cSJoseph Huber   void *send_ptr = malloc(send_size);
32d21e507cSJoseph Huber   void *recv_ptr;
33d21e507cSJoseph Huber   uint64_t recv_size;
34d21e507cSJoseph Huber 
35d21e507cSJoseph Huber   inline_memcpy(send_ptr, str, send_size);
36d21e507cSJoseph Huber   ASSERT_TRUE(inline_memcmp(send_ptr, str, send_size) == 0 && "Data mismatch");
37*89614cebSJoseph Huber   LIBC_NAMESPACE::rpc::Client::Port port =
38*89614cebSJoseph Huber       LIBC_NAMESPACE::rpc::client.open<RPC_TEST_STREAM>();
39d21e507cSJoseph Huber   port.send_n(send_ptr, send_size);
40d21e507cSJoseph Huber   port.recv_n(&recv_ptr, &recv_size,
41d21e507cSJoseph Huber               [](uint64_t size) { return malloc(size); });
42d21e507cSJoseph Huber   port.close();
43d21e507cSJoseph Huber   ASSERT_TRUE(inline_memcmp(recv_ptr, str, recv_size) == 0 && "Data mismatch");
44d21e507cSJoseph Huber   ASSERT_TRUE(recv_size == send_size && "Data size mismatch");
45d21e507cSJoseph Huber 
46d21e507cSJoseph Huber   free(send_ptr);
47d21e507cSJoseph Huber   free(recv_ptr);
48d21e507cSJoseph Huber }
49d21e507cSJoseph Huber 
5029d3da3bSJoseph Huber static void test_divergent() {
5129d3da3bSJoseph Huber   static const uint8_t data[] = {
5229d3da3bSJoseph Huber       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,  12,  13,  14,
5329d3da3bSJoseph Huber       15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
5429d3da3bSJoseph Huber       30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
5529d3da3bSJoseph Huber       45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
5629d3da3bSJoseph Huber       60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
5729d3da3bSJoseph Huber       75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
5829d3da3bSJoseph Huber       90,  91,  92,  93,  94,  95,  96,  97,  98,  99,  100, 101, 102, 103, 104,
5929d3da3bSJoseph Huber       105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
6029d3da3bSJoseph Huber       120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
6129d3da3bSJoseph Huber       135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
6229d3da3bSJoseph Huber       150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
6329d3da3bSJoseph Huber       165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
6429d3da3bSJoseph Huber       180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
6529d3da3bSJoseph Huber       195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
6629d3da3bSJoseph Huber       210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
6729d3da3bSJoseph Huber       225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
6829d3da3bSJoseph Huber       240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
6929d3da3bSJoseph Huber       255,
7029d3da3bSJoseph Huber   };
7129d3da3bSJoseph Huber 
7229d3da3bSJoseph Huber   uint8_t buffer[128] = {0};
7329d3da3bSJoseph Huber   uint64_t offset =
7429d3da3bSJoseph Huber       (gpu::get_thread_id() + gpu::get_num_threads() * gpu::get_block_id()) %
7529d3da3bSJoseph Huber       128;
7629d3da3bSJoseph Huber   void *recv_ptr;
7729d3da3bSJoseph Huber   uint64_t recv_size;
7829d3da3bSJoseph Huber   inline_memcpy(buffer, &data[offset], offset);
7929d3da3bSJoseph Huber   ASSERT_TRUE(inline_memcmp(buffer, &data[offset], offset) == 0 &&
8029d3da3bSJoseph Huber               "Data mismatch");
81*89614cebSJoseph Huber   LIBC_NAMESPACE::rpc::Client::Port port =
82*89614cebSJoseph Huber       LIBC_NAMESPACE::rpc::client.open<RPC_TEST_STREAM>();
8329d3da3bSJoseph Huber   port.send_n(buffer, offset);
8429d3da3bSJoseph Huber   inline_memset(buffer, offset, 0);
8529d3da3bSJoseph Huber   port.recv_n(&recv_ptr, &recv_size, [&](uint64_t) { return buffer; });
8629d3da3bSJoseph Huber   port.close();
8729d3da3bSJoseph Huber 
8829d3da3bSJoseph Huber   ASSERT_TRUE(inline_memcmp(recv_ptr, &data[offset], recv_size) == 0 &&
8929d3da3bSJoseph Huber               "Data mismatch");
9029d3da3bSJoseph Huber   ASSERT_TRUE(recv_size == offset && "Data size mismatch");
9129d3da3bSJoseph Huber }
9229d3da3bSJoseph Huber 
93d21e507cSJoseph Huber TEST_MAIN(int argc, char **argv, char **envp) {
94d21e507cSJoseph Huber   test_stream();
9529d3da3bSJoseph Huber   test_divergent();
96d21e507cSJoseph Huber 
97d21e507cSJoseph Huber   return 0;
98d21e507cSJoseph Huber }
99