summaryrefslogtreecommitdiff
path: root/libc/utils/gpu/loader/amdgpu/Loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libc/utils/gpu/loader/amdgpu/Loader.cpp')
-rw-r--r--libc/utils/gpu/loader/amdgpu/Loader.cpp42
1 files changed, 12 insertions, 30 deletions
diff --git a/libc/utils/gpu/loader/amdgpu/Loader.cpp b/libc/utils/gpu/loader/amdgpu/Loader.cpp
index ad5e02116918..fac81a2057b5 100644
--- a/libc/utils/gpu/loader/amdgpu/Loader.cpp
+++ b/libc/utils/gpu/loader/amdgpu/Loader.cpp
@@ -335,31 +335,18 @@ int load(int argc, char **argv, char **envp, void *image, size_t size,
if (hsa_status_t err = hsa_agent_get_info(
dev_agent, HSA_AGENT_INFO_WAVEFRONT_SIZE, &wavefront_size))
handle_error(err);
- void *server_inbox;
- void *server_outbox;
- void *buffer;
- if (hsa_status_t err = hsa_amd_memory_pool_allocate(
- finegrained_pool, port_size * sizeof(__llvm_libc::cpp::Atomic<int>),
- /*flags=*/0, &server_inbox))
- handle_error(err);
- if (hsa_status_t err = hsa_amd_memory_pool_allocate(
- finegrained_pool, port_size * sizeof(__llvm_libc::cpp::Atomic<int>),
- /*flags=*/0, &server_outbox))
- handle_error(err);
- if (hsa_status_t err = hsa_amd_memory_pool_allocate(
- finegrained_pool,
- port_size *
- align_up(sizeof(__llvm_libc::rpc::Header) +
- (wavefront_size * sizeof(__llvm_libc::rpc::Buffer)),
- alignof(__llvm_libc::rpc::Packet)),
- /*flags=*/0, &buffer))
- handle_error(err);
- hsa_amd_agents_allow_access(1, &dev_agent, nullptr, server_inbox);
- hsa_amd_agents_allow_access(1, &dev_agent, nullptr, server_outbox);
- hsa_amd_agents_allow_access(1, &dev_agent, nullptr, buffer);
+
+ uint64_t rpc_shared_buffer_size =
+ __llvm_libc::rpc::Server::allocation_size(port_size, wavefront_size);
+ void *rpc_shared_buffer;
+ if (hsa_status_t err =
+ hsa_amd_memory_pool_allocate(finegrained_pool, rpc_shared_buffer_size,
+ /*flags=*/0, &rpc_shared_buffer))
+ handle_error(err);
+ hsa_amd_agents_allow_access(1, &dev_agent, nullptr, rpc_shared_buffer);
// Initialize the RPC server's buffer for host-device communication.
- server.reset(port_size, wavefront_size, server_inbox, server_outbox, buffer);
+ server.reset(port_size, wavefront_size, rpc_shared_buffer);
// Obtain a queue with the minimum (power of two) size, used to send commands
// to the HSA runtime and launch execution on the device.
@@ -374,8 +361,7 @@ int load(int argc, char **argv, char **envp, void *image, size_t size,
handle_error(err);
LaunchParameters single_threaded_params = {1, 1, 1, 1, 1, 1};
- begin_args_t init_args = {argc, dev_argv, dev_envp,
- server_outbox, server_inbox, buffer};
+ begin_args_t init_args = {argc, dev_argv, dev_envp, rpc_shared_buffer};
if (hsa_status_t err =
launch_kernel(dev_agent, executable, kernargs_pool, queue,
single_threaded_params, "_begin.kd", init_args))
@@ -422,11 +408,7 @@ int load(int argc, char **argv, char **envp, void *image, size_t size,
handle_error(err);
if (hsa_status_t err = hsa_amd_memory_pool_free(dev_ret))
handle_error(err);
- if (hsa_status_t err = hsa_amd_memory_pool_free(server_inbox))
- handle_error(err);
- if (hsa_status_t err = hsa_amd_memory_pool_free(server_outbox))
- handle_error(err);
- if (hsa_status_t err = hsa_amd_memory_pool_free(buffer))
+ if (hsa_status_t err = hsa_amd_memory_pool_free(rpc_shared_buffer))
handle_error(err);
if (hsa_status_t err = hsa_amd_memory_pool_free(host_ret))
handle_error(err);