ONE - On-device Neural Engine
Loading...
Searching...
No Matches
onert::backend::trix::ops::BulkPipelineBuffer Class Reference

#include <BulkPipelineBuffer.h>

Public Types

enum class  BufferType { DMABUF_CONT , DMABUF_IOMMU }
 

Public Member Functions

 BulkPipelineBuffer (BufferType type, size_t size, int device_id)
 
 ~BulkPipelineBuffer ()
 
 BulkPipelineBuffer (const BulkPipelineBuffer &)=delete
 
BulkPipelineBufferoperator= (const BulkPipelineBuffer &)=delete
 
void allocate ()
 
void deallocate ()
 
size_t size () const
 
generic_buffer * getGenericBuffer ()
 
void fillFromFile (FILE *fp, size_t offset=0)
 
bool isReady () const
 

Detailed Description

Definition at line 28 of file BulkPipelineBuffer.h.

Member Enumeration Documentation

◆ BufferType

Enumerator
DMABUF_CONT 
DMABUF_IOMMU 

Definition at line 31 of file BulkPipelineBuffer.h.

Constructor & Destructor Documentation

◆ BulkPipelineBuffer() [1/2]

onert::backend::trix::ops::BulkPipelineBuffer::BulkPipelineBuffer ( BufferType  type,
size_t  size,
int  device_id 
)

Definition at line 40 of file BulkPipelineBuffer.cc.

41 : _type(type), _size(size), _device_id(device_id)
42{
43 // DO NOTHING
44}
int32_t type

◆ ~BulkPipelineBuffer()

onert::backend::trix::ops::BulkPipelineBuffer::~BulkPipelineBuffer ( )

◆ BulkPipelineBuffer() [2/2]

onert::backend::trix::ops::BulkPipelineBuffer::BulkPipelineBuffer ( const BulkPipelineBuffer )
delete

Member Function Documentation

◆ allocate()

void onert::backend::trix::ops::BulkPipelineBuffer::allocate ( )

Definition at line 52 of file BulkPipelineBuffer.cc.

53{
54 if (_buffer && _buffer->addr != nullptr)
55 {
56 // Already allocated
57 return;
58 }
59
60 if (!_buffer)
61 {
62 _buffer = new generic_buffer{};
63 }
64
65 // Open the device
66 char devname[16];
67 snprintf(devname, sizeof(devname), "/dev/triv2-%d", _device_id);
68 _dev_fd = open(devname, O_RDWR);
69 if (_dev_fd < 0)
70 {
71 throw std::runtime_error("Failed to open NPU device: " + std::string(devname));
72 }
73
74 // Allocate a buffer
75 struct trix_ioctl_hwmem hwmem;
76 hwmem.type = (_type == BufferType::DMABUF_CONT) ? 0 : 1;
77 hwmem.size = getAlignedSize(_size);
78
79 _buffer->dmabuf = ioctl(_dev_fd, TRIX_IOCTL_HWMEM_ALLOC, &hwmem);
80 if (_buffer->dmabuf < 0)
81 {
82 close(_dev_fd);
83 _dev_fd = -1;
84 throw std::runtime_error("Failed to allocate DMA buffer, size: " + std::to_string(hwmem.size));
85 }
86
87 // Mapping the buffer
88 _buffer->addr = mmap(nullptr, hwmem.size, PROT_READ | PROT_WRITE, MAP_SHARED, _buffer->dmabuf, 0);
89 if (_buffer->addr == MAP_FAILED)
90 {
91 close(_buffer->dmabuf);
92 close(_dev_fd);
93 _buffer->dmabuf = -1;
94 _dev_fd = -1;
95 _buffer->addr = nullptr;
96 throw std::runtime_error("Failed to mmap DMA buffer");
97 }
98
99 _buffer->size = _size;
100 _buffer->type = BUFFER_DMABUF;
101}
#define TRIX_IOCTL_HWMEM_ALLOC

References DMABUF_CONT, onert::backend::trix::ops::trix_ioctl_hwmem::size, TRIX_IOCTL_HWMEM_ALLOC, and onert::backend::trix::ops::trix_ioctl_hwmem::type.

◆ deallocate()

void onert::backend::trix::ops::BulkPipelineBuffer::deallocate ( )

Definition at line 103 of file BulkPipelineBuffer.cc.

104{
105 if (!_buffer)
106 {
107 return;
108 }
109
110 if (_buffer->addr != nullptr)
111 {
112 size_t aligned_sz = getAlignedSize(_buffer->size);
113 munmap(_buffer->addr, aligned_sz);
114 _buffer->addr = nullptr;
115 }
116
117 if (_buffer->dmabuf >= 0)
118 {
119 struct trix_ioctl_hwmem hwmem;
120 hwmem.dbuf_fd = _buffer->dmabuf;
121 ioctl(_dev_fd, TRIX_IOCTL_HWMEM_DEALLOC, &hwmem);
122 close(_buffer->dmabuf);
123 _buffer->dmabuf = -1;
124 }
125
126 if (_dev_fd >= 0)
127 {
128 close(_dev_fd);
129 _dev_fd = -1;
130 }
131
132 delete _buffer;
133 _buffer = nullptr;
134}
#define TRIX_IOCTL_HWMEM_DEALLOC

References onert::backend::trix::ops::trix_ioctl_hwmem::dbuf_fd, and TRIX_IOCTL_HWMEM_DEALLOC.

Referenced by ~BulkPipelineBuffer().

◆ fillFromFile()

void onert::backend::trix::ops::BulkPipelineBuffer::fillFromFile ( FILE *  fp,
size_t  offset = 0 
)

Definition at line 136 of file BulkPipelineBuffer.cc.

137{
138 if (!isReady())
139 {
140 throw std::runtime_error("Buffer is not allocated");
141 }
142
143 if (!fp)
144 {
145 throw std::runtime_error("Invalid file pointer");
146 }
147
148 if (fseek(fp, static_cast<long>(offset), SEEK_SET) != 0)
149 {
150 throw std::runtime_error("Failed to seek file to offset: " + std::to_string(offset));
151 }
152
153 if (fread(_buffer->addr, _buffer->size, 1, fp) != 1)
154 {
155 throw std::runtime_error("Failed to read " + std::to_string(_buffer->size) +
156 " bytes from file");
157 }
158}
__global uchar * offset(const Image *img, int x, int y)
Definition helpers.h:540

References isReady(), and offset().

◆ getGenericBuffer()

generic_buffer * onert::backend::trix::ops::BulkPipelineBuffer::getGenericBuffer ( )
inline

Definition at line 50 of file BulkPipelineBuffer.h.

50{ return _buffer; }

◆ isReady()

bool onert::backend::trix::ops::BulkPipelineBuffer::isReady ( ) const

Definition at line 50 of file BulkPipelineBuffer.cc.

50{ return _buffer && _buffer->addr != nullptr; }

Referenced by fillFromFile().

◆ operator=()

BulkPipelineBuffer & onert::backend::trix::ops::BulkPipelineBuffer::operator= ( const BulkPipelineBuffer )
delete

◆ size()

size_t onert::backend::trix::ops::BulkPipelineBuffer::size ( ) const

Definition at line 48 of file BulkPipelineBuffer.cc.

48{ return _buffer ? _buffer->size : 0; }

The documentation for this class was generated from the following files: