From f8e184d7e1f2dae7419a7732ca0aa7bd330bacc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20L=C3=BCtke=20Dreimann?= Date: Tue, 26 Aug 2025 14:17:51 +0200 Subject: [PATCH] fixed vgpu duplication --- repos/hello_gpgpu/src/consumer1/main.cc | 28 ++----------- repos/hello_gpgpu/src/consumer2/main.cc | 28 ++----------- .../src/hello_gpgpu/CL/cl_genode.cc | 40 ++++++++++++++++--- .../src/hello_gpgpu/CL/cl_genode.h | 35 ++++++++++++++-- 4 files changed, 73 insertions(+), 58 deletions(-) diff --git a/repos/hello_gpgpu/src/consumer1/main.cc b/repos/hello_gpgpu/src/consumer1/main.cc index 5b55ad2a34..b55fbd1d5a 100644 --- a/repos/hello_gpgpu/src/consumer1/main.cc +++ b/repos/hello_gpgpu/src/consumer1/main.cc @@ -25,13 +25,8 @@ namespace ns_OpenSurf{int main(int argc, char *argv[]);}; struct consumer_conv { Genode::Env &env; - gpgpu_virt::Connection backend_driver; - Genode::Allocator_stupid allocator; - const unsigned long size = 0x40000000; cl_genode clg; - Genode::Ram_dataspace_capability vgpu_mem_ram_cap; - Genode::Ram_dataspace_capability vgpu_shm_ram_cap; volatile uint8_t *ready; const unsigned long img_size = 320 * 240 * sizeof(float); @@ -42,28 +37,13 @@ struct consumer_conv Genode::log("===Init Consumer Surf==="); clInitGenode(clg); - // register vgpu (optional?) - const unsigned long size_vgpu_mem = 0x1000; - backend_driver.register_vm(size_vgpu_mem, vgpu_mem_ram_cap); - // create shm for gpu const unsigned long id = 0; - Genode::size_t total_size = 0; - while (total_size == 0) - { - backend_driver.ask_shm(id, total_size, vgpu_shm_ram_cap); - } - - // attach shm to vm - Genode::addr_t mapped_base = env.rm().attach(vgpu_shm_ram_cap); - clg.add_shm_mapped_base(id, mapped_base); - - // use it in allocator - allocator.add_range(mapped_base, total_size); + clg.get_shm(id); // alloc whole data - ready = (uint8_t *)allocator.alloc(1); - data = (float *)allocator.alloc_aligned(0x10000, img_size); + ready = (uint8_t *)clg.shm_alloc(id, 1); + data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size); } void run() @@ -86,7 +66,7 @@ struct consumer_conv Genode::log("Consumer Surf completed"); } - consumer_conv(Genode::Env &e) : env(e), backend_driver(env), allocator(), clg(env, size), ready(nullptr), data(nullptr) + consumer_conv(Genode::Env &e) : env(e), clg(env, size), ready(nullptr), data(nullptr) { } }; diff --git a/repos/hello_gpgpu/src/consumer2/main.cc b/repos/hello_gpgpu/src/consumer2/main.cc index 6fa2c7db48..75b7ddc446 100644 --- a/repos/hello_gpgpu/src/consumer2/main.cc +++ b/repos/hello_gpgpu/src/consumer2/main.cc @@ -25,13 +25,8 @@ namespace ns_convolution_2d{int main(int argc, char *argv[]);}; struct consumer_conv { Genode::Env &env; - gpgpu_virt::Connection backend_driver; - Genode::Allocator_stupid allocator; - const unsigned long size = 0x40000000; cl_genode clg; - Genode::Ram_dataspace_capability vgpu_mem_ram_cap; - Genode::Ram_dataspace_capability vgpu_shm_ram_cap; volatile uint8_t *ready; const unsigned long img_size = 320 * 240 * sizeof(float); @@ -42,28 +37,13 @@ struct consumer_conv Genode::log("===Init Consumer Conv==="); clInitGenode(clg); - // register vgpu (optional?) - const unsigned long size_vgpu_mem = 0x1000; - backend_driver.register_vm(size_vgpu_mem, vgpu_mem_ram_cap); - // create shm for gpu const unsigned long id = 0; - Genode::size_t total_size = 0; - while (total_size == 0) - { - backend_driver.ask_shm(id, total_size, vgpu_shm_ram_cap); - } - - // attach shm to vm - Genode::addr_t mapped_base = env.rm().attach(vgpu_shm_ram_cap); - clg.add_shm_mapped_base(id, mapped_base); - - // use it in allocator - allocator.add_range(mapped_base, total_size); + clg.get_shm(id); // alloc whole data - ready = (uint8_t *)allocator.alloc(1); - data = (float *)allocator.alloc_aligned(0x10000, img_size); + ready = (uint8_t *)clg.shm_alloc(id, 1); + data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size); } void run() @@ -86,7 +66,7 @@ struct consumer_conv Genode::log("Consumer Conv completed"); } - consumer_conv(Genode::Env &e) : env(e), backend_driver(env), allocator(), clg(env, size), ready(nullptr), data(nullptr) + consumer_conv(Genode::Env &e) : env(e), clg(env, size), ready(nullptr), data(nullptr) { } }; diff --git a/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.cc b/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.cc index 6670f3c79a..44c2fef505 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.cc +++ b/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.cc @@ -1,6 +1,6 @@ #include "cl_genode.h" -cl_genode::cl_genode(Genode::Env& env, unsigned long size) : env(env), allocator(), mapped_base(0), backend_driver(env), shm_mapped_base{0, } +cl_genode::cl_genode(Genode::Env& env, unsigned long size) : env(env), allocator(), mapped_base(0), backend_driver(env), shm_allocator(), shm_mapped_base{0, } { // get shared memory with driver Genode::Ram_dataspace_capability ram_cap; @@ -18,6 +18,24 @@ cl_genode::~cl_genode() } +void cl_genode::get_shm(int shmid) +{ + // create shm for gpu + Genode::size_t total_size = 0; + Genode::Ram_dataspace_capability ram_cap; + while (total_size == 0) + { + backend_driver.ask_shm(shmid, total_size, ram_cap); + } + + // attach shm to vm + shm_mapped_base[shmid] = env.rm().attach(ram_cap); + + // use it in allocator + shm_allocator[shmid].add_range(shm_mapped_base[shmid], total_size); + +} + void* cl_genode::aligned_alloc(Genode::uint32_t alignment, Genode::uint32_t size) { return allocator.alloc_aligned(alignment, size); @@ -33,6 +51,21 @@ void cl_genode::free(void* addr) allocator.free(addr); } +void* cl_genode::shm_aligned_alloc(int shmid, Genode::uint32_t alignment, Genode::uint32_t size) +{ + return shm_allocator[shmid].alloc_aligned(alignment, size); +} + +void* cl_genode::shm_alloc(int shmid, Genode::uint32_t size) +{ + return shm_allocator[shmid].alloc(size); +} + +void cl_genode::shm_free(int shmid, void* addr) +{ + shm_allocator[shmid].free(addr); +} + void cl_genode::enqueue_task(struct kernel_config* kconf) { // convert virt vm addr to offset @@ -56,8 +89,3 @@ void cl_genode::wait(struct kernel_config* kconf) asm("nop"); } } - -void cl_genode::add_shm_mapped_base(int shmid, Genode::addr_t mbase) -{ - shm_mapped_base[shmid] = mbase; -} diff --git a/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.h b/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.h index a572c1f9ff..dda244cb43 100644 --- a/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.h +++ b/repos/hello_gpgpu/src/hello_gpgpu/CL/cl_genode.h @@ -33,7 +33,8 @@ private: // rpc gpgpu_virt::Connection backend_driver; - // shm mapped_bases + // shm + Genode::Allocator_stupid shm_allocator[MAX_SHM_REGIONS]; Genode::addr_t shm_mapped_base[MAX_SHM_REGIONS]; // do not allow copies @@ -108,12 +109,38 @@ public: void reset() { allocator.reset(); } /** - * @brief + * @brief Get the shm object * * @param shmid - * @param mbase */ - void add_shm_mapped_base(int shmid, Genode::addr_t mbase); + void get_shm(int shmid); + + /** + * @brief allocate aligned memory + * + * @param shmid the shared memory id + * @param alignment the alignment + * @param size the size in bytes + * @return void* the address of the allocated memory + */ + void* shm_aligned_alloc(int shmid, Genode::uint32_t alignment, Genode::uint32_t size); + + /** + * @brief + * + * @param shmid the shared memory id + * @param size + * @return void* + */ + void* shm_alloc(int shmid, Genode::uint32_t size); + + /** + * @brief free memory + * + * @param shmid the shared memory id + * @param addr the address of the memory to be freed + */ + void shm_free(int shmid, void* addr); }; #endif // CL_GENODE_H