VM2D  1.12
Vortex methods for 2D flows simulation
Gpu2D.h
Go to the documentation of this file.
1 /*--------------------------------*- VM2D -*-----------------*---------------*\
2 | ## ## ## ## #### ##### | | Version 1.12 |
3 | ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2024/01/14 |
4 | ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5 | #### ## ## ## ## ## | Open Source Code |
6 | ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7 | |
8 | Copyright (C) 2017-2024 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9 *-----------------------------------------------------------------------------*
10 | File name: Gpu2D.h |
11 | Info: Source code of VM2D |
12 | |
13 | This file is part of VM2D. |
14 | VM2D is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VM2D is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VM2D. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
41 #ifndef GPU_H
42 #define GPU_H
43 
44 #include <limits>
45 #include <memory>
46 
47 #include "cuLib2D.cuh"
48 #include "Gpudefs.h"
49 
50 #include "wrapper.h"
51 
52 namespace VM2D
53 {
54 
55  class World2D;
56 
67  class Gpu
68  {
69  private:
71  const World2D& W;
72 
73  public:
74 
75  //static int nReserve; //Для контроля паритета выделения и освобождения памяти
76 
77 #if defined(__CUDACC__) || defined(USE_CUDA)
78 
81  template<typename T>
82  void ReleaseDevMem(T* ptr, int code)
83  {
84  cuDeleteFromDev(ptr, code);
85  //--nReserve;
86  }
87 
88 
99  template<typename T, size_t dim>
100  T* ReserveDevMem(size_t n, size_t& new_n)
101  {
102  size_t nBlocks = n / CUBLOCK;
103  if (n % CUBLOCK)
104  nBlocks++;
105 
106  new_n = nBlocks * CUBLOCK;
107 
108  void* ptr;
109 
110  cuReserveDevMem(ptr, new_n * dim * sizeof(T));
111  //++nReserve;
112 
113  return (T*)ptr;
114  } //ReserveDevMem(...)
115 
116 
126  template<typename T>
127  T* ReserveDevMemAndCopyFixedArray(size_t n, T* host_src)
128  {
129  void* dev_ptr;
130 
131  cuReserveDevMem(dev_ptr, n * sizeof(T));
132  //++nReserve;
133 
134  cuCopyFixedArray(dev_ptr, host_src, sizeof(T) * n);
135 
136  return (T*)dev_ptr;
137  }//ReserveDevMemAndCopyFixedArray(...)
138 
139 
147  template<typename T, size_t dim>
148  void CopyMemFromDev(size_t n, T* dev_ptr, T* host_ptr, int code = 0) const
149  {
150  cuCopyMemFromDev((void*)host_ptr, (void*)dev_ptr, sizeof(T) * n * dim, code);
151  };//CopyMemFromDev(...)
152 
160  template<typename T, size_t dim>
161  void CopyMemToDev(size_t n, T* host_ptr, T* dev_ptr) const
162  {
163  cuCopyFixedArray((void*)dev_ptr, (void*)host_ptr, sizeof(T) * n * dim);
164  };//CopyMemToDev(...)
165 
166 
168  void RefreshWake(int code = 0);
169 
171  void RefreshAfls(int code = 0);
172  void RefreshVirtualWakes(int code = 0);
173 
175  void RefreshVP(int code = 0);
176 
177 
178  // Ниже - данные для вычисления скоростей
179 
181  size_t n_CUDA_afls;
182 
184  size_t* dev_ptr_nPanels;
185  size_t* dev_ptr_nVortices;
186 
187 
188  //Переменная, которая лежит на хосте и хранит адрес на видеокарте массива, в котором хранятся указатели на соответствующие массивы
189  double** dev_ptr_ptr_vtx;
190  double** dev_ptr_ptr_vel;
191  double** dev_ptr_ptr_rad;
192  double** dev_ptr_ptr_i0;
193  double** dev_ptr_ptr_i1;
194  double** dev_ptr_ptr_i2;
195  double** dev_ptr_ptr_i3;
196 
197  double** dev_ptr_ptr_r;
198  double** dev_ptr_ptr_rhs;
199 
200  double** dev_ptr_ptr_freeVortexSheet;
201  double** dev_ptr_ptr_attachedVortexSheet;
202  double** dev_ptr_ptr_attachedSourceSheet;
203 
204  double** dev_ptr_ptr_meanEpsOverPanel;
205 
206  double** dev_ptr_ptr_viscousStresses;
207 
209  std::vector<size_t> n_CUDA_virtWake;
210  size_t n_CUDA_totalVirtWake;
211 
213  std::vector<size_t> n_CUDA_panel;
214 
216  size_t n_CUDA_wake;
217 
218 
220  size_t n_CUDA_source;
221 
223  size_t n_CUDA_velVP;
224 
225  size_t n_CUDA_bodies;
226  BHcu::CUDApointers CUDAptrs;
227 #endif
228 
232  Gpu(const World2D& W_);
233 
235  ~Gpu();
236 
237 
241  void setAccelCoeff(double cft_)
242  {
243 #if defined(__CUDACC__) || defined(USE_CUDA)
244  cuSetAccelCoeff(cft_);
245 #endif
246  }
247 
248 
253  void setCollapseCoeff(double pos_, double refLength_)
254  {
255 #if defined(__CUDACC__) || defined(USE_CUDA)
256  cuSetCollapseCoeff(pos_, refLength_);
257 #endif
258  }
259 
260 
264  void setMaxGamma(double gam_)
265  {
266 #if defined(__CUDACC__) || defined(USE_CUDA)
267  cuSetMaxGamma(gam_);
268 #endif
269  }
270 
271 
278  void setSchemeSwitcher(int schemeSwitcher_)
279  {
280 #if defined(__CUDACC__) || defined(USE_CUDA)
281  cuSetSchemeSwitcher(schemeSwitcher_, 1);
282 #endif
283  }
284  };
285 
286 }//namespace VM2D
287 
288 
289 
290 
291 namespace VM2D
292 {
293  template <class T>
294  class MyAlloc {
295  public:
296  // type definitions
297  typedef T value_type;
298  typedef T* pointer;
299  typedef const T* const_pointer;
300  typedef T& reference;
301  typedef const T& const_reference;
302  typedef std::size_t size_type;
303  typedef std::ptrdiff_t difference_type;
304 
305  // rebind allocator to type U
306  template <class U>
307  struct rebind {
308  typedef MyAlloc<U> other;
309  };
310 
311  // return address of values
312  pointer address(reference value) const {
313  return &value;
314  }
315  const_pointer address(const_reference value) const {
316  return &value;
317  }
318 
319  /* constructors and destructor
320  * - nothing to do because the allocator has no state
321  */
322  MyAlloc() throw() {
323  }
324  MyAlloc(const MyAlloc&) throw() {
325  }
326  template <class U>
327  MyAlloc(const MyAlloc<U>&) throw() {
328  }
329  ~MyAlloc() throw() {
330  }
331 
332  // return maximum number of elements that can be allocated
333  size_type max_size() const throw() {
334  return std::numeric_limits<std::size_t>::max() / sizeof(T);
335  }
336 
337  // allocate but don't initialize num elements of type T
338  pointer allocate(size_type num, const void* = 0) {
339  // print message and allocate memory with global new
340  //std::cerr << "allocate " << num << " element(s)" << " of size " << sizeof(T) << std::endl;
341 
342  pointer ret = (pointer)(::operator new(num * sizeof(T)));
343 
344  //pointer ret;
345  //cudaHostAlloc((void**)&ret, num * sizeof(T), cudaHostAllocDefault);
346  cuAlloc((void**)&ret, num * sizeof(T));
347 
348  //std::cerr << " allocated at: " << (void*)ret << std::endl;
349  return ret;
350  }
351 
352  // initialize elements of allocated storage p with value value
353  void construct(pointer p, const T& value) {
354  // initialize memory with placement new
355  new((void*)p)T(value);
356  //std::cerr << " construct " << std::endl;
357  }
358 
359  // destroy elements of initialized storage p
360  void destroy(pointer p) {
361  // destroy objects by calling their destructor
362  p->~T();
363  //std::cerr << " destroy " << std::endl;
364  }
365 
366  // deallocate storage p of deleted elements
367  void deallocate(pointer p, size_type num) {
368  // print message and deallocate memory with global delete
369 
370  //std::cerr << "deallocate " << num << " element(s)" << " of size " << sizeof(T) << " at: " << (void*)p << std::endl;
371 
372  //::operator delete((void*)p);
373  cuDalloc((void*)p);
374  }
375  };
376 
377  // return that all specializations of this allocator are interchangeable
378  template <class T1, class T2>
380  const MyAlloc<T2>&) throw() {
381  return true;
382  }
383  template <class T1, class T2>
385  const MyAlloc<T2>&) throw() {
386  return false;
387  }
388 
389 
390  /*{
391  // create a vector, using MyAlloc<> as allocator
392  std::vector<int, VM2D::MyAlloc<int> > v(5, 37);
393 
394  v.resize(0);
395 
396  // insert elements
397  // - causes reallocations
398  v.push_back(42);
399  v.push_back(56);
400 
401  v.reserve(10);
402 
403  v.push_back(11);
404  v.push_back(22);
405  v.push_back(33);
406  v.push_back(44);
407  }
408  */
409 
410 }
411 
412 
413 
414 
415 
416 
417 
418 
419 
420 
421 
422 
423 
424 
425 
426 
427 #endif
MyAlloc(const MyAlloc &)
Definition: Gpu2D.h:324
void setSchemeSwitcher(int schemeSwitcher_)
Установка переключателя расчетных схем
Definition: Gpu2D.h:278
const_pointer address(const_reference value) const
Definition: Gpu2D.h:315
#define CUBLOCK
Definition: Gpudefs.h:73
bool operator!=(const MyAlloc< T1 > &, const MyAlloc< T2 > &)
Definition: Gpu2D.h:384
void deallocate(pointer p, size_type num)
Definition: Gpu2D.h:367
Класс, обеспечивающий возможность выполнения вычислений на GPU по технологии Nvidia CUDA...
Definition: Gpu2D.h:67
T value_type
Definition: Gpu2D.h:297
void setMaxGamma(double gam_)
Установка максимально допустимой циркуляции вихря
Definition: Gpu2D.h:264
T & reference
Definition: Gpu2D.h:300
Definition: Airfoil2D.h:45
std::size_t size_type
Definition: Gpu2D.h:302
T * pointer
Definition: Gpu2D.h:298
const T * const_pointer
Definition: Gpu2D.h:299
MyAlloc(const MyAlloc< U > &)
Definition: Gpu2D.h:327
void setAccelCoeff(double cft_)
Установка коэффициента разгона потока
Definition: Gpu2D.h:241
const World2D & W
Константная ссылка на решаемую задачу
Definition: Gpu2D.h:71
pointer address(reference value) const
Definition: Gpu2D.h:312
Описание констант и параметров для взаимодействия с графическим ускорителем
void setCollapseCoeff(double pos_, double refLength_)
Установка правой границы самого правого профиля (для организации увеличения радиуса коллапса) ...
Definition: Gpu2D.h:253
~Gpu()
Definition: Gpu2D.cpp:93
size_type max_size() const
Definition: Gpu2D.h:333
void destroy(pointer p)
Definition: Gpu2D.h:360
bool operator==(const MyAlloc< T1 > &, const MyAlloc< T2 > &)
Definition: Gpu2D.h:379
Класс, опеделяющий текущую решаемую задачу
Definition: World2D.h:68
pointer allocate(size_type num, const void *=0)
Definition: Gpu2D.h:338
MyAlloc< U > other
Definition: Gpu2D.h:308
void construct(pointer p, const T &value)
Definition: Gpu2D.h:353
Gpu(const World2D &W_)
Конструктор
Definition: Gpu2D.cpp:57
const T & const_reference
Definition: Gpu2D.h:301
std::ptrdiff_t difference_type
Definition: Gpu2D.h:303