|
<html><head><title>dlib C++ Library - cuda_data_ptr.h</title></head><body bgcolor='white'><pre> |
|
<font color='#009900'>// Copyright (C) 2017 Davis E. King ([email protected]) |
|
</font><font color='#009900'>// License: Boost Software License See LICENSE.txt for the full license. |
|
</font><font color='#0000FF'>#ifndef</font> DLIB_DNN_CuDA_DATA_PTR_H_ |
|
<font color='#0000FF'>#define</font> DLIB_DNN_CuDA_DATA_PTR_H_ |
|
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='../assert.h.html'>../assert.h</a>" |
|
|
|
<font color='#0000FF'>#ifdef</font> DLIB_USE_CUDA |
|
|
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>memory<font color='#5555FF'>></font> |
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>vector<font color='#5555FF'>></font> |
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>type_traits<font color='#5555FF'>></font> |
|
|
|
<font color='#0000FF'>namespace</font> dlib |
|
<b>{</b> |
|
<font color='#0000FF'>namespace</font> cuda |
|
<b>{</b> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'>class</font> cuda_data_void_ptr; |
|
<font color='#0000FF'>class</font> <b><a name='weak_cuda_data_void_ptr'></a>weak_cuda_data_void_ptr</b> |
|
<b>{</b> |
|
<font color='#009900'>/*! |
|
WHAT THIS OBJECT REPRESENTS |
|
This is just like a std::weak_ptr version of cuda_data_void_ptr. It allows you |
|
to hold a non-owning reference to a cuda_data_void_ptr. |
|
!*/</font> |
|
<font color='#0000FF'>public</font>: |
|
<b><a name='weak_cuda_data_void_ptr'></a>weak_cuda_data_void_ptr</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#0000FF'>default</font>; |
|
|
|
<b><a name='weak_cuda_data_void_ptr'></a>weak_cuda_data_void_ptr</b><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> cuda_data_void_ptr<font color='#5555FF'>&</font> ptr<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='reset'></a>reset</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> pdata.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; num <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <b>}</b> |
|
|
|
cuda_data_void_ptr <b><a name='lock'></a>lock</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font>; |
|
<font color='#009900'>/*! |
|
ensures |
|
- if (the memory block referenced by this object hasn't been deleted) then |
|
- returns a cuda_data_void_ptr referencing that memory block |
|
- else |
|
- returns a default initialized cuda_data_void_ptr (i.e. an empty one). |
|
!*/</font> |
|
|
|
<font color='#0000FF'>private</font>: |
|
<font color='#0000FF'><u>size_t</u></font> num <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
std::weak_ptr<font color='#5555FF'><</font><font color='#0000FF'><u>void</u></font><font color='#5555FF'>></font> pdata; |
|
<b>}</b>; |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>class</font> <b><a name='cuda_data_void_ptr'></a>cuda_data_void_ptr</b> |
|
<b>{</b> |
|
<font color='#009900'>/*! |
|
WHAT THIS OBJECT REPRESENTS |
|
This is a block of memory on a CUDA device. |
|
!*/</font> |
|
<font color='#0000FF'>public</font>: |
|
|
|
<b><a name='cuda_data_void_ptr'></a>cuda_data_void_ptr</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#0000FF'>default</font>; |
|
|
|
<b><a name='cuda_data_void_ptr'></a>cuda_data_void_ptr</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>size_t</u></font> n<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
ensures |
|
- This object will allocate a device memory buffer of n bytes. |
|
- #size() == n |
|
!*/</font> |
|
|
|
<font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font> <b><a name='data'></a>data</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>return</font> pdata.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font> <b><a name='data'></a>data</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> pdata.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
<b><a name='operator'></a>operator</b> <font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>return</font> pdata.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
<b><a name='operator'></a>operator</b> <font color='#0000FF'>const</font> <font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> pdata.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='reset'></a>reset</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> pdata.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
|
|
<font color='#0000FF'><u>size_t</u></font> <b><a name='size'></a>size</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> num; <b>}</b> |
|
<font color='#009900'>/*! |
|
ensures |
|
- returns the length of this buffer, in bytes. |
|
!*/</font> |
|
|
|
cuda_data_void_ptr <b><a name='operator'></a>operator</b><font color='#5555FF'>+</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>size_t</u></font> offset<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<font color='#009900'>/*! |
|
requires |
|
- offset < size() |
|
ensures |
|
- returns a pointer that is offset by the given amount. |
|
!*/</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>offset <font color='#5555FF'><</font> num<font face='Lucida Console'>)</font>; |
|
cuda_data_void_ptr temp; |
|
temp.num <font color='#5555FF'>=</font> num<font color='#5555FF'>-</font>offset; |
|
temp.pdata <font color='#5555FF'>=</font> std::shared_ptr<font color='#5555FF'><</font><font color='#0000FF'><u>void</u></font><font color='#5555FF'>></font><font face='Lucida Console'>(</font>pdata, <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font><font face='Lucida Console'>)</font>pdata.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font>offset<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> temp; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='shrink'></a>shrink</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>size_t</u></font> new_size<font face='Lucida Console'>)</font> |
|
<font color='#009900'>/*! |
|
requires |
|
- new_size <= num |
|
ensures |
|
- #size() == new_size |
|
- Doesn't actually deallocate anything, just changes the size() metadata to a |
|
smaller number and only for this instance of the pointer. |
|
!*/</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>new_size <font color='#5555FF'><</font><font color='#5555FF'>=</font> num<font face='Lucida Console'>)</font>; |
|
num <font color='#5555FF'>=</font> new_size; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>private</font>: |
|
|
|
<font color='#0000FF'>friend</font> <font color='#0000FF'>class</font> weak_cuda_data_void_ptr; |
|
<font color='#0000FF'><u>size_t</u></font> num <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
std::shared_ptr<font color='#5555FF'><</font><font color='#0000FF'><u>void</u></font><font color='#5555FF'>></font> pdata; |
|
<b>}</b>; |
|
|
|
<font color='#0000FF'>inline</font> cuda_data_void_ptr <b><a name='operator'></a>operator</b><font color='#5555FF'>+</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>size_t</u></font> offset, <font color='#0000FF'>const</font> cuda_data_void_ptr<font color='#5555FF'>&</font> rhs<font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>return</font> rhs<font color='#5555FF'>+</font>offset; <b>}</b> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font> dest, |
|
<font color='#0000FF'>const</font> cuda_data_void_ptr<font color='#5555FF'>&</font> src |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
requires |
|
- dest == a pointer to at least src.size() bytes on the host machine. |
|
ensures |
|
- copies the GPU data from src into dest. |
|
- This routine is equivalent to performing: memcpy(dest,src,src.size()) |
|
!*/</font> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font> dest, |
|
<font color='#0000FF'>const</font> cuda_data_void_ptr<font color='#5555FF'>&</font> src, |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>size_t</u></font> num |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
requires |
|
- dest == a pointer to at least num bytes on the host machine. |
|
- num <= src.size() |
|
ensures |
|
- copies the GPU data from src into dest. Copies only the first num bytes |
|
of src to dest. |
|
!*/</font> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font> |
|
cuda_data_void_ptr dest, |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font> src |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
requires |
|
- dest == a pointer to at least src.size() bytes on the host machine. |
|
ensures |
|
- copies the host data from src to the GPU memory buffer dest. |
|
- This routine is equivalent to performing: memcpy(dest,src,dest.size()) |
|
!*/</font> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font> |
|
cuda_data_void_ptr dest, |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>void</u></font><font color='#5555FF'>*</font> src, |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>size_t</u></font> num |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
requires |
|
- dest == a pointer to at least num bytes on the host machine. |
|
- num <= dest.size() |
|
ensures |
|
- copies the host data from src to the GPU memory buffer dest. Copies only |
|
the first num bytes of src to dest. |
|
!*/</font> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> <font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> <font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'>class</font> <b><a name='cuda_data_ptr'></a>cuda_data_ptr</b> |
|
<b>{</b> |
|
<font color='#009900'>/*! |
|
WHAT THIS OBJECT REPRESENTS |
|
This is a block of memory on a CUDA device. It is just a type safe |
|
version of cuda_data_void_ptr. |
|
!*/</font> |
|
|
|
<font color='#0000FF'>public</font>: |
|
|
|
<b><a name='static_assert'></a>static_assert</b><font face='Lucida Console'>(</font>std::is_standard_layout<font color='#5555FF'><</font>T<font color='#5555FF'>></font>::value, "<font color='#CC0000'>You can only create basic standard layout types on the GPU</font>"<font face='Lucida Console'>)</font>; |
|
|
|
<b><a name='cuda_data_ptr'></a>cuda_data_ptr</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#0000FF'>default</font>; |
|
<b><a name='cuda_data_ptr'></a>cuda_data_ptr</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>size_t</u></font> n<font face='Lucida Console'>)</font> : num<font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font> |
|
<font color='#009900'>/*! |
|
ensures |
|
- This object will allocate a device memory buffer of n T objects. |
|
- #size() == n |
|
!*/</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font>; |
|
|
|
pdata <font color='#5555FF'>=</font> <font color='#BB00BB'>cuda_data_void_ptr</font><font face='Lucida Console'>(</font>n<font color='#5555FF'>*</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<b><a name='cuda_data_ptr'></a>cuda_data_ptr</b><font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> cuda_data_ptr<font color='#5555FF'><</font><font color='#0000FF'>typename</font> std::remove_const<font color='#5555FF'><</font>T<font color='#5555FF'>></font>::type<font color='#5555FF'>></font> <font color='#5555FF'>&</font>other |
|
<font face='Lucida Console'>)</font> : num<font face='Lucida Console'>(</font>other.num<font face='Lucida Console'>)</font>, pdata<font face='Lucida Console'>(</font>other.pdata<font face='Lucida Console'>)</font> <b>{</b><b>}</b> |
|
<font color='#009900'>/*! |
|
ensures |
|
- *this is a copy of other. This version of the copy constructor allows |
|
assigning non-const pointers to const ones. For instance, converting from |
|
cuda_data_ptr<float> to cuda_data_ptr<const float>. |
|
!*/</font> |
|
|
|
T<font color='#5555FF'>*</font> <b><a name='data'></a>data</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>T<font color='#5555FF'>*</font><font face='Lucida Console'>)</font>pdata.<font color='#BB00BB'>data</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
<font color='#0000FF'>const</font> T<font color='#5555FF'>*</font> <b><a name='data'></a>data</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>T<font color='#5555FF'>*</font><font face='Lucida Console'>)</font>pdata.<font color='#BB00BB'>data</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
|
|
<b><a name='operator'></a>operator</b> T<font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>T<font color='#5555FF'>*</font><font face='Lucida Console'>)</font>pdata.<font color='#BB00BB'>data</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
<b><a name='operator'></a>operator</b> <font color='#0000FF'>const</font> T<font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>T<font color='#5555FF'>*</font><font face='Lucida Console'>)</font>pdata.<font color='#BB00BB'>data</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
|
|
<font color='#0000FF'><u>void</u></font> <b><a name='reset'></a>reset</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <b>{</b> pdata.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <b>}</b> |
|
|
|
<font color='#0000FF'><u>size_t</u></font> <b><a name='size'></a>size</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> <b>{</b> <font color='#0000FF'>return</font> num; <b>}</b> |
|
<font color='#009900'>/*! |
|
ensures |
|
- returns the number of T instances pointed to by *this. |
|
!*/</font> |
|
|
|
<b><a name='operator'></a>operator</b> <b><a name='cuda_data_void_ptr'></a>cuda_data_void_ptr</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<font color='#009900'>/*! |
|
ensures |
|
- returns *this as a cuda_data_void_ptr. Importantly, the returned size() will |
|
reflect the number of bytes referenced by *this. To be clear, let P be the |
|
returned pointer. Then: |
|
- P.get() == get() |
|
- P.size() == size() * sizeof(T) |
|
!*/</font> |
|
<b>{</b> |
|
cuda_data_void_ptr temp <font color='#5555FF'>=</font> pdata; |
|
temp.<font color='#BB00BB'>shrink</font><font face='Lucida Console'>(</font><font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>*</font> <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> temp; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>private</font>: |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> U<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> cuda_data_ptr<font color='#5555FF'><</font>U<font color='#5555FF'>></font> <b><a name='static_pointer_cast'></a>static_pointer_cast</b><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> cuda_data_void_ptr <font color='#5555FF'>&</font>ptr<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> U<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> cuda_data_ptr<font color='#5555FF'><</font>U<font color='#5555FF'>></font> <b><a name='static_pointer_cast'></a>static_pointer_cast</b><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> cuda_data_void_ptr <font color='#5555FF'>&</font>ptr, <font color='#0000FF'><u>size_t</u></font> num<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> U<font color='#5555FF'>></font> |
|
<font color='#0000FF'>friend</font> <font color='#0000FF'>class</font> cuda_data_ptr; |
|
|
|
<font color='#0000FF'><u>size_t</u></font> num <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
cuda_data_void_ptr pdata; |
|
<b>}</b>; |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font> <b><a name='static_pointer_cast'></a>static_pointer_cast</b><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> cuda_data_void_ptr <font color='#5555FF'>&</font>ptr<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>ptr.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>%</font> <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font>, |
|
"<font color='#CC0000'>Size of memory buffer in ptr doesn't match sizeof(T). </font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\nptr.size(): </font>"<font color='#5555FF'><</font><font color='#5555FF'><</font> ptr.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\nsizeof(T): </font>"<font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font> result; |
|
result.pdata <font color='#5555FF'>=</font> ptr; |
|
result.num <font color='#5555FF'>=</font> ptr.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>/</font> <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> result; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font> <b><a name='static_pointer_cast'></a>static_pointer_cast</b><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> cuda_data_void_ptr <font color='#5555FF'>&</font>ptr, <font color='#0000FF'><u>size_t</u></font> num<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>num<font color='#5555FF'>*</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> ptr.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, |
|
"<font color='#CC0000'>Size of memory buffer in ptr isn't big enough to represent this many T objects. </font>" |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\nnum: </font>"<font color='#5555FF'><</font><font color='#5555FF'><</font> num |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\nnum*sizeof(T): </font>"<font color='#5555FF'><</font><font color='#5555FF'><</font> num<font color='#5555FF'>*</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\nsizeof(T): </font>"<font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'><</font><font color='#5555FF'><</font> "<font color='#CC0000'>\nptr.size(): </font>"<font color='#5555FF'><</font><font color='#5555FF'><</font> ptr.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font> result; |
|
result.pdata <font color='#5555FF'>=</font> ptr; |
|
result.num <font color='#5555FF'>=</font> num; |
|
<font color='#0000FF'>return</font> result; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font>std::vector<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> dest, <font color='#0000FF'>const</font> cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> src<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
dest.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font>src.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>src.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>memcpy</font><font face='Lucida Console'>(</font>dest.<font color='#BB00BB'>data</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>cuda_data_void_ptr<font color='#5555FF'>></font><font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font>cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> dest, <font color='#0000FF'>const</font> std::vector<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> src<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>src.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> dest.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
dest <font color='#5555FF'>=</font> cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font face='Lucida Console'>(</font>src.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>dest.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>memcpy</font><font face='Lucida Console'>(</font><font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>cuda_data_void_ptr<font color='#5555FF'>></font><font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>, src.<font color='#BB00BB'>data</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font>cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> dest, <font color='#0000FF'>const</font> T<font color='#5555FF'>*</font> src<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>memcpy</font><font face='Lucida Console'>(</font><font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>cuda_data_void_ptr<font color='#5555FF'>></font><font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>, src<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font>cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> dest, <font color='#0000FF'>const</font> T<font color='#5555FF'>*</font> src, <font color='#0000FF'><u>size_t</u></font> num<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>num <font color='#5555FF'><</font><font color='#5555FF'>=</font> dest.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>memcpy</font><font face='Lucida Console'>(</font><font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>cuda_data_void_ptr<font color='#5555FF'>></font><font face='Lucida Console'>(</font>dest<font face='Lucida Console'>)</font>, src, num<font color='#5555FF'>*</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font>T<font color='#5555FF'>*</font> dest, <font color='#0000FF'>const</font> cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> src<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>memcpy</font><font face='Lucida Console'>(</font>dest, <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>cuda_data_void_ptr<font color='#5555FF'>></font><font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>template</font> <font color='#5555FF'><</font><font color='#0000FF'>typename</font> T<font color='#5555FF'>></font> |
|
<font color='#0000FF'><u>void</u></font> <b><a name='memcpy'></a>memcpy</b><font face='Lucida Console'>(</font>T<font color='#5555FF'>*</font> dest, <font color='#0000FF'>const</font> cuda_data_ptr<font color='#5555FF'><</font>T<font color='#5555FF'>></font><font color='#5555FF'>&</font> src, <font color='#0000FF'><u>size_t</u></font> num<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>DLIB_CASSERT</font><font face='Lucida Console'>(</font>num <font color='#5555FF'><</font><font color='#5555FF'>=</font> src.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>memcpy</font><font face='Lucida Console'>(</font>dest, <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>cuda_data_void_ptr<font color='#5555FF'>></font><font face='Lucida Console'>(</font>src<font face='Lucida Console'>)</font>, num<font color='#5555FF'>*</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>T<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ------------------------------------------------------------------------------------ |
|
</font> |
|
cuda_data_void_ptr <b><a name='device_global_buffer'></a>device_global_buffer</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>size_t</u></font> size<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>/*! |
|
ensures |
|
- Returns a pointer to a globally shared CUDA memory buffer on the |
|
currently selected CUDA device. The buffer is also thread local. So |
|
each host thread will get its own buffer. You can use this global buffer |
|
as scratch space for CUDA computations that all take place on the default |
|
stream. Using it in this way ensures that there aren't any race conditions |
|
involving the use of the buffer. |
|
- The returned pointer will point to at least size bytes. It may point to more. |
|
- The global buffer is deallocated once all references to it are destructed. |
|
However, if device_global_buffer() is called before then with a size <= the last |
|
size requested, then the previously returned global buffer pointer is returned. |
|
This avoids triggering expensive CUDA reallocations. So if you want to avoid |
|
these reallocations then hold a copy of the pointer returned by this function. |
|
However, as a general rule, client code should not hold the returned |
|
cuda_data_void_ptr for long durations, but instead should call |
|
device_global_buffer() whenever the buffer is needed, and overwrite the previously |
|
returned pointer with the new pointer. Doing so ensures multiple buffers are not |
|
kept around in the event that multiple sized buffers are requested. To explain |
|
this, consider this code, assumed to execute at program startup: |
|
auto ptr1 = device_global_buffer(1); |
|
auto ptr2 = device_global_buffer(2); |
|
auto ptr3 = device_global_buffer(3); |
|
since the sizes increased at each call 3 separate buffers were allocated. First |
|
one of size 1, then of size 2, then of size 3. If we then executed: |
|
ptr1 = device_global_buffer(1); |
|
ptr2 = device_global_buffer(2); |
|
ptr3 = device_global_buffer(3); |
|
all three of these pointers would now point to the same buffer, since the smaller |
|
requests can be satisfied by returning the size 3 buffer in each case. |
|
!*/</font> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#endif</font> <font color='#009900'>// DLIB_USE_CUDA |
|
</font> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>// DLIB_DNN_CuDA_DATA_PTR_H_ |
|
</font> |
|
|
|
</pre></body></html> |