mirror of
https://git.rwth-aachen.de/acs/public/villas/node/
synced 2025-03-30 00:00:11 +01:00

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.
87 lines
1.5 KiB
C++
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
|