added and enabled stupid allocator

This commit is contained in:
Marcel Lütke Dreimann
2022-12-01 15:21:53 +01:00
parent 453f43ca11
commit c85ccbb35e
6 changed files with 222 additions and 7 deletions

View File

@@ -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)

View File

@@ -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);

View 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); }

View 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 */

View File

@@ -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===");

View File

@@ -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 \