1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-30 00:00:11 +01:00
VILLASnode/fpga/lib/gpu/include/villas/gpu.hpp
Daniel Krebs 13fd3f3c2a gpu: implement basic GPU plugin that can do DMA to and from its memory
Using CUDA, memory can be allocated on the GPU and shared to peers on
the PCIe bus such as the FPGA. Furthermore, the DMA on the GPU can also
be used to read and write to/from other memory on the PCIe bus, such as
BRAM on the FPGA.
2018-05-15 18:15:17 +02:00

87 lines
1.5 KiB
C++

#pragma once
#include <sstream>
#include <plugin.hpp>
#include <memory_manager.hpp>
#include <memory.hpp>
#include <villas/log.hpp>
namespace villas {
namespace gpu {
class GpuAllocator;
class Gpu {
friend GpuAllocator;
public:
Gpu(int gpuId);
~Gpu();
bool init();
std::string getName() const;
GpuAllocator& getAllocator() const
{ return *allocator; }
bool makeAccessibleToPCIeAndVA(const MemoryBlock& mem);
/// Make some memory block accssible for this GPU
bool makeAccessibleFromPCIeOrHostRam(const MemoryBlock& mem);
void memcpySync(const MemoryBlock& src, const MemoryBlock& dst, size_t size);
void memcpyKernel(const MemoryBlock& src, const MemoryBlock& dst, size_t size);
private:
bool registerIoMemory(const MemoryBlock& mem);
bool registerHostMemory(const MemoryBlock& mem);
private:
class impl;
std::unique_ptr<impl> pImpl;
// master, will be used to derived slave addr spaces for allocation
MemoryManager::AddressSpaceId masterPciEAddrSpaceId;
MemoryManager::AddressSpaceId slaveMemoryAddrSpaceId;
SpdLogger logger;
int gpuId;
std::unique_ptr<GpuAllocator> allocator;
};
class GpuAllocator : public BaseAllocator<GpuAllocator> {
public:
GpuAllocator(Gpu& gpu);
std::string getName() const;
std::unique_ptr<MemoryBlock, MemoryBlock::deallocator_fn>
allocateBlock(size_t size);
private:
Gpu& gpu;
};
class GpuFactory : public Plugin {
public:
GpuFactory();
std::list<std::unique_ptr<Gpu>>
make();
void run(void*);
private:
SpdLogger logger;
};
} // namespace villas
} // namespace gpu