Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
Buffers.cxx
Go to the documentation of this file.
1/*
2 * Project: RooFit
3 * Authors:
4 * Jonas Rembser, CERN 11/2021
5 *
6 * Copyright (c) 2021, CERN
7 *
8 * Redistribution and use in source and binary forms,
9 * with or without modification, are permitted according to the terms
10 * listed in LICENSE (http://roofit.sourceforge.net/license.txt)
11 */
12
14
15#include <RooBatchCompute.h>
16
17#include <stdexcept>
18#include <functional>
19#include <queue>
20#include <map>
21
22namespace ROOT {
23namespace Experimental {
24namespace Detail {
25
27public:
30 {
31 if (size != 1)
32 throw std::runtime_error("ScalarBufferContainer can only be of size 1");
33 }
34 std::size_t size() const { return 1; }
35
36 double const *cpuReadPtr() const { return &_val; }
37 double const *gpuReadPtr() const { return &_val; }
38
39 double *cpuWritePtr() { return &_val; }
40 double *gpuWritePtr() { return &_val; }
41
42private:
43 double _val;
44};
45
47public:
49 CPUBufferContainer(std::size_t size) : _vec(size) {}
50 std::size_t size() const { return _vec.size(); }
51
52 double const *cpuReadPtr() const { return _vec.data(); }
53 double const *gpuReadPtr() const
54 {
55 throw std::bad_function_call();
56 return nullptr;
57 }
58
59 double *cpuWritePtr() { return _vec.data(); }
60 double *gpuWritePtr()
61 {
62 throw std::bad_function_call();
63 return nullptr;
64 }
65
66private:
67 std::vector<double> _vec;
68};
69
71public:
74 {
75 _data = static_cast<double *>(RooBatchCompute::dispatchCUDA->cudaMalloc(size * sizeof(double)));
76 _size = size;
77 }
79 {
80 if (_data)
82 }
85 GPUBufferContainer(GPUBufferContainer &&other) { *this = std::move(other); }
87 {
88 _data = other._data;
89 other._data = nullptr;
90 _size = other._size;
91 other._size = 0;
92 return *this;
93 }
94 std::size_t size() const { return _size; }
95
96 double const *cpuReadPtr() const
97 {
98 throw std::bad_function_call();
99 return nullptr;
100 }
101 double const *gpuReadPtr() const { return static_cast<double *>(_data); }
102
103 double *cpuWritePtr() const
104 {
105 throw std::bad_function_call();
106 return nullptr;
107 }
108 double *gpuWritePtr() const { return static_cast<double *>(_data); }
109
110private:
111 double *_data = nullptr;
112 std::size_t _size;
113};
114
116public:
119 {
120 _data = static_cast<double *>(RooBatchCompute::dispatchCUDA->cudaMallocHost(size * sizeof(double)));
121 _size = size;
123 }
126 PinnedBufferContainer(PinnedBufferContainer &&other) { *this = std::move(other); }
128 {
129 _data = other._data;
130 other._data = nullptr;
131 _size = other._size;
132 other._size = 0;
133 _gpuBuffer = std::move(other._gpuBuffer);
134 return *this;
135 }
136 std::size_t size() const { return _size; }
137
138 void setCudaStream(cudaStream_t *stream) { _cudaStream = stream; }
139
140 double const *cpuReadPtr() const
141 {
142
146 }
147
149 return static_cast<double *>(_data);
150 }
151 double const *gpuReadPtr() const
152 {
153
157 }
158
160 return _gpuBuffer.gpuReadPtr();
161 }
162
163 double *cpuWritePtr()
164 {
166 return static_cast<double *>(_data);
167 }
168 double *gpuWritePtr()
169 {
171 return _gpuBuffer.gpuWritePtr();
172 }
173
174private:
176
177 double *_data = nullptr;
178 std::size_t _size;
180 cudaStream_t *_cudaStream = nullptr;
182};
183
184template <class Container>
185class BufferImpl : public AbsBuffer {
186public:
187 using Queue = std::queue<Container>;
188 using QueuesMap = std::map<std::size_t, Queue>;
189
190 BufferImpl(std::size_t size, QueuesMap &queuesMap) : _queue{queuesMap[size]}
191 {
192 if (_queue.empty()) {
193 _vec = Container(size);
194 } else {
195 _vec = std::move(_queue.front());
196 _queue.pop();
197 }
198 }
199
200 ~BufferImpl() override { _queue.emplace(std::move(_vec)); }
201
202 double const *cpuReadPtr() const override { return _vec.cpuReadPtr(); }
203 double const *gpuReadPtr() const override { return _vec.gpuReadPtr(); }
204
205 double *cpuWritePtr() override { return _vec.cpuWritePtr(); }
206 double *gpuWritePtr() override { return _vec.gpuWritePtr(); }
207
208 Container &vec() { return _vec; }
209
210private:
211 Container _vec;
213};
214
219
225};
226
228{
230}
231
233{
234 delete _queuesMaps;
235}
236
238{
240}
242{
244}
246{
248}
249AbsBuffer *BufferManager::makePinnedBuffer(std::size_t size, cudaStream_t *stream)
250{
252 out->vec().setCudaStream(stream);
253 return out;
254}
255
256} // end namespace Detail
257} // end namespace Experimental
258} // end namespace ROOT
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
BufferImpl(std::size_t size, QueuesMap &queuesMap)
Definition Buffers.cxx:190
std::map< std::size_t, Queue > QueuesMap
Definition Buffers.cxx:188
std::queue< Container > Queue
Definition Buffers.cxx:187
double const * gpuReadPtr() const override
Definition Buffers.cxx:203
double const * cpuReadPtr() const override
Definition Buffers.cxx:202
AbsBuffer * makeCpuBuffer(std::size_t size)
Definition Buffers.cxx:241
AbsBuffer * makePinnedBuffer(std::size_t size, cudaStream_t *stream=nullptr)
Definition Buffers.cxx:249
AbsBuffer * makeGpuBuffer(std::size_t size)
Definition Buffers.cxx:245
GPUBufferContainer(const GPUBufferContainer &)=delete
GPUBufferContainer & operator=(const GPUBufferContainer &)=delete
GPUBufferContainer(GPUBufferContainer &&other)
Definition Buffers.cxx:85
GPUBufferContainer & operator=(GPUBufferContainer &&other)
Definition Buffers.cxx:86
PinnedBufferContainer & operator=(const PinnedBufferContainer &)=delete
PinnedBufferContainer(const PinnedBufferContainer &)=delete
PinnedBufferContainer & operator=(PinnedBufferContainer &&other)
Definition Buffers.cxx:127
PinnedBufferContainer(PinnedBufferContainer &&other)
Definition Buffers.cxx:126
virtual void memcpyToCPU(void *, const void *, size_t, cudaStream_t *=nullptr)
virtual void memcpyToCUDA(void *, const void *, size_t, cudaStream_t *=nullptr)
This file contains a specialised ROOT message handler to test for diagnostic in unit tests.
R__EXTERN RooBatchComputeInterface * dispatchCUDA
PinnedBuffer::QueuesMap pinnedBufferQueuesMap
Definition Buffers.cxx:224
ScalarBuffer::QueuesMap scalarBufferQueuesMap
Definition Buffers.cxx:221