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 34 of file BulkPipelineBuffer.h.

Member Enumeration Documentation

◆ BufferType

Enumerator
DMABUF_CONT 
DMABUF_IOMMU 

Definition at line 37 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 46 of file BulkPipelineBuffer.cc.

47 : _type(type), _size(size), _device_id(device_id)
48{
49 // DO NOTHING
50}
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 58 of file BulkPipelineBuffer.cc.

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

110{
111 if (!_buffer)
112 {
113 return;
114 }
115
116 if (_buffer->addr != nullptr)
117 {
118 size_t aligned_sz = getAlignedSize(_buffer->size);
119 munmap(_buffer->addr, aligned_sz);
120 _buffer->addr = nullptr;
121 }
122
123 if (_buffer->dmabuf >= 0)
124 {
125 struct trix_ioctl_hwmem hwmem;
126 hwmem.dbuf_fd = _buffer->dmabuf;
127 ioctl(_dev_fd, TRIX_IOCTL_HWMEM_DEALLOC, &hwmem);
128 close(_buffer->dmabuf);
129 _buffer->dmabuf = -1;
130 }
131
132 if (_dev_fd >= 0)
133 {
134 close(_dev_fd);
135 _dev_fd = -1;
136 }
137
138 delete _buffer;
139 _buffer = nullptr;
140}
#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 142 of file BulkPipelineBuffer.cc.

143{
144 if (!isReady())
145 {
146 throw std::runtime_error("Buffer is not allocated");
147 }
148
149 if (!fp)
150 {
151 throw std::runtime_error("Invalid file pointer");
152 }
153
154 if (fseek(fp, static_cast<long>(offset), SEEK_SET) != 0)
155 {
156 throw std::runtime_error("Failed to seek file to offset: " + std::to_string(offset));
157 }
158
159 if (fread(_buffer->addr, _buffer->size, 1, fp) != 1)
160 {
161 throw std::runtime_error("Failed to read " + std::to_string(_buffer->size) +
162 " bytes from file");
163 }
164}
__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 56 of file BulkPipelineBuffer.h.

56{ return _buffer; }

◆ isReady()

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

Definition at line 56 of file BulkPipelineBuffer.cc.

56{ 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 54 of file BulkPipelineBuffer.cc.

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

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