fixed vgpu duplication

This commit is contained in:
Marcel Lütke Dreimann
2025-08-26 14:17:51 +02:00
parent ac9b7412fb
commit f8e184d7e1
4 changed files with 73 additions and 58 deletions

View File

@@ -25,13 +25,8 @@ namespace ns_OpenSurf{int main(int argc, char *argv[]);};
struct consumer_conv struct consumer_conv
{ {
Genode::Env &env; Genode::Env &env;
gpgpu_virt::Connection backend_driver;
Genode::Allocator_stupid allocator;
const unsigned long size = 0x40000000; const unsigned long size = 0x40000000;
cl_genode clg; cl_genode clg;
Genode::Ram_dataspace_capability vgpu_mem_ram_cap;
Genode::Ram_dataspace_capability vgpu_shm_ram_cap;
volatile uint8_t *ready; volatile uint8_t *ready;
const unsigned long img_size = 320 * 240 * sizeof(float); const unsigned long img_size = 320 * 240 * sizeof(float);
@@ -42,28 +37,13 @@ struct consumer_conv
Genode::log("===Init Consumer Surf==="); Genode::log("===Init Consumer Surf===");
clInitGenode(clg); 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 // create shm for gpu
const unsigned long id = 0; const unsigned long id = 0;
Genode::size_t total_size = 0; clg.get_shm(id);
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);
// alloc whole data // alloc whole data
ready = (uint8_t *)allocator.alloc(1); ready = (uint8_t *)clg.shm_alloc(id, 1);
data = (float *)allocator.alloc_aligned(0x10000, img_size); data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size);
} }
void run() void run()
@@ -86,7 +66,7 @@ struct consumer_conv
Genode::log("Consumer Surf completed"); 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)
{ {
} }
}; };

View File

@@ -25,13 +25,8 @@ namespace ns_convolution_2d{int main(int argc, char *argv[]);};
struct consumer_conv struct consumer_conv
{ {
Genode::Env &env; Genode::Env &env;
gpgpu_virt::Connection backend_driver;
Genode::Allocator_stupid allocator;
const unsigned long size = 0x40000000; const unsigned long size = 0x40000000;
cl_genode clg; cl_genode clg;
Genode::Ram_dataspace_capability vgpu_mem_ram_cap;
Genode::Ram_dataspace_capability vgpu_shm_ram_cap;
volatile uint8_t *ready; volatile uint8_t *ready;
const unsigned long img_size = 320 * 240 * sizeof(float); const unsigned long img_size = 320 * 240 * sizeof(float);
@@ -42,28 +37,13 @@ struct consumer_conv
Genode::log("===Init Consumer Conv==="); Genode::log("===Init Consumer Conv===");
clInitGenode(clg); 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 // create shm for gpu
const unsigned long id = 0; const unsigned long id = 0;
Genode::size_t total_size = 0; clg.get_shm(id);
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);
// alloc whole data // alloc whole data
ready = (uint8_t *)allocator.alloc(1); ready = (uint8_t *)clg.shm_alloc(id, 1);
data = (float *)allocator.alloc_aligned(0x10000, img_size); data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size);
} }
void run() void run()
@@ -86,7 +66,7 @@ struct consumer_conv
Genode::log("Consumer Conv completed"); 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)
{ {
} }
}; };

View File

@@ -1,6 +1,6 @@
#include "cl_genode.h" #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 // get shared memory with driver
Genode::Ram_dataspace_capability ram_cap; 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) void* cl_genode::aligned_alloc(Genode::uint32_t alignment, Genode::uint32_t size)
{ {
return allocator.alloc_aligned(alignment, size); return allocator.alloc_aligned(alignment, size);
@@ -33,6 +51,21 @@ void cl_genode::free(void* addr)
allocator.free(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) void cl_genode::enqueue_task(struct kernel_config* kconf)
{ {
// convert virt vm addr to offset // convert virt vm addr to offset
@@ -56,8 +89,3 @@ void cl_genode::wait(struct kernel_config* kconf)
asm("nop"); asm("nop");
} }
} }
void cl_genode::add_shm_mapped_base(int shmid, Genode::addr_t mbase)
{
shm_mapped_base[shmid] = mbase;
}

View File

@@ -33,7 +33,8 @@ private:
// rpc // rpc
gpgpu_virt::Connection backend_driver; 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]; Genode::addr_t shm_mapped_base[MAX_SHM_REGIONS];
// do not allow copies // do not allow copies
@@ -108,12 +109,38 @@ public:
void reset() { allocator.reset(); } void reset() { allocator.reset(); }
/** /**
* @brief * @brief Get the shm object
* *
* @param shmid * @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 #endif // CL_GENODE_H