mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-21 12:32:56 +01:00
added and enabled stupid allocator
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
#include "cl_genode.h"
|
||||
|
||||
cl_genode::cl_genode(Genode::Env& env, unsigned long size) : env(env), heap{ env.ram(), env.rm() }, allocator(&heap), mapped_base(0), backend_driver(env)
|
||||
cl_genode::cl_genode(Genode::Env& env, unsigned long size) : env(env),
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
allocator(),
|
||||
#else // USE_STUPID_ALLOCATOR
|
||||
heap{ env.ram(), env.rm() }, allocator(&heap),
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
mapped_base(0), backend_driver(env)
|
||||
{
|
||||
// get shared memory with driver
|
||||
Genode::Ram_dataspace_capability ram_cap;
|
||||
@@ -20,6 +26,9 @@ cl_genode::~cl_genode()
|
||||
|
||||
void* cl_genode::aligned_alloc(Genode::uint32_t alignment, Genode::uint32_t size)
|
||||
{
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
return allocator.alloc_aligned(alignment, size);
|
||||
#else // USE_STUPID_ALLOCATOR
|
||||
if(alignment == 0x1000)
|
||||
{
|
||||
alignment = 12;
|
||||
@@ -39,6 +48,7 @@ void* cl_genode::aligned_alloc(Genode::uint32_t alignment, Genode::uint32_t size
|
||||
return nullptr;
|
||||
}
|
||||
);
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
}
|
||||
|
||||
void* cl_genode::alloc(Genode::uint32_t size)
|
||||
|
||||
@@ -5,8 +5,13 @@
|
||||
#include <base/env.h>
|
||||
|
||||
// allocator
|
||||
#define USE_STUPID_ALLOCATOR
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
#include "../allocator_stupid.h"
|
||||
#else // USE_STUPID_ALLOCATOR
|
||||
#include <base/heap.h>
|
||||
#include <base/allocator_avl.h>
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
#include <dataspace/client.h>
|
||||
|
||||
// pci
|
||||
@@ -25,8 +30,12 @@ private:
|
||||
Genode::Env& env;
|
||||
|
||||
// allocator
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
Genode::Allocator_stupid allocator;
|
||||
#else // USE_STUPID_ALLOCATOR
|
||||
Genode::Heap heap;
|
||||
Genode::Allocator_avl allocator;
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::addr_t mapped_base;
|
||||
|
||||
// rpc
|
||||
@@ -79,9 +88,15 @@ public:
|
||||
*
|
||||
* @return Genode::Allocator_avl&
|
||||
*/
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
Genode::Allocator_stupid& getAlloc() {
|
||||
return allocator;
|
||||
}
|
||||
#else // USE_STUPID_ALLOCATOR
|
||||
Genode::Allocator_avl& getAlloc() {
|
||||
return allocator;
|
||||
}
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
|
||||
/**
|
||||
* @brief
|
||||
@@ -104,6 +119,10 @@ public:
|
||||
*/
|
||||
void wait(struct kernel_config* kconf);
|
||||
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
void reset() { allocator.reset(); }
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
|
||||
/**
|
||||
* @brief print bench results */
|
||||
void print_vgpu_bench(unsigned long i);
|
||||
|
||||
35
repos/hello_gpgpu/src/hello_gpgpu/allocator_stupid.cc
Normal file
35
repos/hello_gpgpu/src/hello_gpgpu/allocator_stupid.cc
Normal file
@@ -0,0 +1,35 @@
|
||||
#include "allocator_stupid.h"
|
||||
|
||||
using namespace Genode;
|
||||
|
||||
void* Allocator_stupid::alloc(size_t size)
|
||||
{
|
||||
if(m_curr + size > m_end)
|
||||
return nullptr;
|
||||
|
||||
const addr_t naddr = m_curr;
|
||||
m_curr += size;
|
||||
|
||||
return (void*)naddr;
|
||||
}
|
||||
|
||||
void* Allocator_stupid::alloc_aligned(uint32_t alignment, size_t size)
|
||||
{
|
||||
m_curr = (m_curr + alignment - 1) & ~(alignment - 1);
|
||||
return alloc(size);
|
||||
}
|
||||
|
||||
void Allocator_stupid::free(void* addr)
|
||||
{
|
||||
(void)addr;
|
||||
}
|
||||
|
||||
void Allocator_stupid::reset()
|
||||
{
|
||||
m_curr = m_start;
|
||||
}
|
||||
|
||||
void *operator new (__SIZE_TYPE__ s, Genode::Allocator_stupid *a) { return a->alloc(s); }
|
||||
void *operator new [] (__SIZE_TYPE__ s, Genode::Allocator_stupid *a) { return a->alloc(s); }
|
||||
void *operator new (__SIZE_TYPE__ s, Genode::Allocator_stupid &a) { return a.alloc(s); }
|
||||
void *operator new [] (__SIZE_TYPE__ s, Genode::Allocator_stupid &a) { return a.alloc(s); }
|
||||
85
repos/hello_gpgpu/src/hello_gpgpu/allocator_stupid.h
Normal file
85
repos/hello_gpgpu/src/hello_gpgpu/allocator_stupid.h
Normal file
@@ -0,0 +1,85 @@
|
||||
#ifndef ALLOCATOR_STUPID
|
||||
#define ALLOCATOR_STUPID
|
||||
|
||||
#include <base/stdint.h>
|
||||
|
||||
namespace Genode {
|
||||
class Allocator_stupid;
|
||||
}
|
||||
|
||||
class Genode::Allocator_stupid
|
||||
{
|
||||
private:
|
||||
/*
|
||||
* Noncopyable
|
||||
*/
|
||||
Allocator_stupid(Allocator_stupid const &);
|
||||
Allocator_stupid &operator = (Allocator_stupid const &);
|
||||
|
||||
/// @brief starting address
|
||||
Genode::addr_t m_start;
|
||||
|
||||
/// @brief current allocation addr
|
||||
Genode::addr_t m_curr;
|
||||
|
||||
/// @brief last address
|
||||
Genode::size_t m_end;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Construct a new Allocator_stupid object
|
||||
*/
|
||||
Allocator_stupid() :
|
||||
m_start(0), m_curr(0), m_end(0) { }
|
||||
|
||||
/**
|
||||
* @brief Destroy the Allocator_stupid object
|
||||
*
|
||||
*/
|
||||
~Allocator_stupid() { }
|
||||
|
||||
/**
|
||||
* @brief allocate memory
|
||||
*
|
||||
* @param size
|
||||
* @return void*
|
||||
*/
|
||||
void* alloc(size_t size);
|
||||
|
||||
/**
|
||||
* @brief allocate aligned memory
|
||||
*
|
||||
* @param alignment
|
||||
* @param size
|
||||
* @return void*
|
||||
*/
|
||||
void* alloc_aligned(Genode::uint32_t alignment, Genode::size_t size);
|
||||
|
||||
/**
|
||||
* @brief free memory
|
||||
*
|
||||
* @param addr
|
||||
*/
|
||||
void free(void* addr);
|
||||
|
||||
/**
|
||||
* @brief free any unfreed memory
|
||||
*
|
||||
*/
|
||||
void reset();
|
||||
|
||||
/**
|
||||
* @brief set address range to allocate from
|
||||
*
|
||||
* @param start
|
||||
* @param size
|
||||
*/
|
||||
void add_range(Genode::addr_t start, Genode::size_t size) { m_start = start; m_curr = start; m_end = m_start + size; };
|
||||
};
|
||||
|
||||
void *operator new (__SIZE_TYPE__ s, Genode::Allocator_stupid *a);
|
||||
void *operator new [] (__SIZE_TYPE__ s, Genode::Allocator_stupid *a);
|
||||
void *operator new (__SIZE_TYPE__ s, Genode::Allocator_stupid &a);
|
||||
void *operator new [] (__SIZE_TYPE__ s, Genode::Allocator_stupid &a);
|
||||
|
||||
#endif /* ALLOCATOR_STUPID */
|
||||
@@ -1,5 +1,7 @@
|
||||
#include <base/log.h>
|
||||
#include <libc/component.h>
|
||||
#include <base/heap.h>
|
||||
#include <base/allocator_avl.h>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -43,49 +45,112 @@ void testvm_construct(Genode::Env &env)
|
||||
Libc::with_libc([&] {
|
||||
Genode::log("===Run 2mm===");
|
||||
ns_2mm::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run 3mm===");
|
||||
ns_3mm::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run atax===");
|
||||
ns_atax::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run bicg===");
|
||||
ns_bicg::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run doitgen===");
|
||||
ns_doitgen::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run gemm===");
|
||||
ns_gemm::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run gemver===");
|
||||
ns_gemver::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run gesummv===");
|
||||
ns_gesummv::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run mvt===");
|
||||
ns_mvt::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run syr2k===");
|
||||
ns_syr2k::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run syrk===");
|
||||
ns_syrk::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
|
||||
//Genode::log("===Run gramschmidt===");
|
||||
//ns_gramschmidt::main(0, 0); // this one is broken (div by 0 and unsolvable input instance) (official Linux version is broken too!)
|
||||
/*Genode::log("===Run gramschmidt===");
|
||||
ns_gramschmidt::main(0, 0); // this one is broken (div by 0 and unsolvable input instance) (official Linux version is broken too!)
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR*/
|
||||
Genode::log("===Run lu===");
|
||||
ns_lu::main(0, 0); // Non-Matching CPU-GPU Outputs Beyond Error Threshold of 0.05 Percent: 516
|
||||
ns_lu::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
|
||||
Genode::log("===Run correlation===");
|
||||
ns_correlation::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run covariance===");
|
||||
ns_covariance::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
|
||||
Genode::log("===Run adi===");
|
||||
ns_adi::main(0, 0); // CPU-GPU Outputs Beyond Error Threshold of 10.05 Percent: 455
|
||||
ns_adi::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run convolution_2d===");
|
||||
ns_convolution_2d::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run convolution_3d===");
|
||||
ns_convolution_3d::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run fdtd_2d===");
|
||||
ns_fdtd_2d::main(0, 0); // Non-Matching CPU-GPU Outputs Beyond Error Threshold of 1.05 Percent: 1
|
||||
ns_fdtd_2d::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run jacobi_1d_imper===");
|
||||
ns_jacobi_1d_imper::main(0, 0); // Non-Matching CPU-GPU Outputs Beyond Error Threshold of 10.05 Percent: 1109
|
||||
ns_jacobi_1d_imper::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
Genode::log("===Run jacobi_2d_imper===");
|
||||
ns_jacobi_2d_imper::main(0, 0);
|
||||
#ifdef USE_STUPID_ALLOCATOR
|
||||
clg.reset();
|
||||
#endif // USE_STUPID_ALLOCATOR
|
||||
});
|
||||
|
||||
Genode::log("===End===");
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
TARGET = hello_gpgpu
|
||||
SRC_CC = main.cc \
|
||||
allocator_stupid.cc \
|
||||
test.cc polybench.cc \
|
||||
CL/cl.cc CL/cl_genode.cc \
|
||||
benchmark/2mm/2mm.cc \
|
||||
|
||||
Reference in New Issue
Block a user