27#ifndef math_cudaPtr_hpp
28#define math_cudaPtr_hpp
35#include <cuda_runtime.h>
37#include "../../mxlib.hpp"
50template <
typename T,
class verboseT = verbose::d>
63 devicePtrT *m_devicePtr{
nullptr };
75 uint32_t m_planes {0};
108 error_t resizeImpl(
size_t sz );
171 error_t upload(
const hostPtrT *src );
181 error_t upload(
const hostPtrT *src,
193 error_t upload(
const hostPtrT *src,
206 error_t upload(
const hostPtrT *src,
216 error_t download( hostPtrT *dest );
221 typename cpp2cudaType<devicePtrT>::cudaType *data()
223 return reinterpret_cast<typename cpp2cudaType<devicePtrT>::cudaType *
>(m_devicePtr);
229 typename cpp2cudaType<devicePtrT>::cudaType *operator()()
231 return reinterpret_cast<typename cpp2cudaType<devicePtrT>::cudaType *
>(m_devicePtr);
238 const typename cpp2cudaType<devicePtrT>::cudaType *operator()()
const
240 return reinterpret_cast<typename cpp2cudaType<devicePtrT>::cudaType *
>(m_devicePtr);
244template <
typename T,
class verboseT>
245cudaPtr<T, verboseT>::~cudaPtr()
250template <
typename T,
class verboseT>
251error_t cudaPtr<T, verboseT>::resizeImpl(
size_t sz )
255 return error_t::noerror;
260 cudaError_t rv = cudaMalloc( (
void **)&m_devicePtr, sz *
sizeof( devicePtrT ) );
262 if( rv != cudaSuccess )
264 return internal::mxlib_error_report<verboseT>(cudaError2error_t(rv),
"cudaMalloc");
267 return error_t::noerror;
271template <
typename T,
class verboseT>
272error_t cudaPtr<T, verboseT>::resize(
size_t sz )
277 return resizeImpl(sz);
280template <
typename T,
class verboseT>
281error_t cudaPtr<T, verboseT>::resize( uint32_t x_sz, uint32_t y_sz )
286 return resizeImpl( x_sz * y_sz );
289template <
typename T,
class verboseT>
290error_t cudaPtr<T, verboseT>::resize( uint32_t x_sz, uint32_t y_sz, uint32_t z_sz )
295 return resize( x_sz * y_sz * z_sz );
298template <
typename T,
class verboseT>
299error_t cudaPtr<T, verboseT>::initialize()
301 cudaError_t rv = ::cudaMemset( m_devicePtr, 0, m_size *
sizeof( devicePtrT ) );
303 if(rv != cudaSuccess)
305 return internal::mxlib_error_report<verboseT>(cudaError2error_t(rv),
"cudaMemset");
308 return error_t::noerror;
311template <
typename T,
class verboseT>
312error_t cudaPtr<T, verboseT>::setZero()
317template <
typename T,
class verboseT>
318error_t cudaPtr<T, verboseT>::free()
322 cudaError_t rv = cudaFree( m_devicePtr );
324 if( rv != cudaSuccess )
326 return internal::mxlib_error_report<verboseT>(cudaError2error_t(rv),
"cudaFree");
328 return error_t::noerror;
334 return error_t::noerror;
337template <
typename T,
class verboseT>
338error_t cudaPtr<T, verboseT>::upload(
const hostPtrT *src )
341 cudaError_t rv = cudaMemcpy( m_devicePtr, src, m_size *
sizeof( devicePtrT ), cudaMemcpyHostToDevice );
343 if( rv != cudaSuccess )
345 return internal::mxlib_error_report<verboseT>(cudaError2error_t(rv),
"cudaMemcpy");
348 return error_t::noerror;
351template <
typename T,
class verboseT>
352error_t cudaPtr<T, verboseT>::upload(
const hostPtrT *src,
size_t x_sz )
360 return internal::mxlib_error_report<verboseT>(rv);
363 return upload( src );
366template <
typename T,
class verboseT>
367error_t cudaPtr<T, verboseT>::upload(
const hostPtrT *src, uint32_t x_sz, uint32_t y_sz )
371 rv = resize( x_sz, y_sz );
375 return internal::mxlib_error_report<verboseT>(rv);
378 return upload( src );
381template <
typename T,
class verboseT>
382error_t cudaPtr<T, verboseT>::upload(
const hostPtrT *src, uint32_t x_sz, uint32_t y_sz, uint32_t z_sz )
386 rv = resize( x_sz, y_sz, z_sz );
390 return internal::mxlib_error_report<verboseT>(rv);
393 return upload( src );
396template <
typename T,
class verboseT>
397error_t cudaPtr<T, verboseT>::download( hostPtrT *dest )
400 cudaError_t rv = cudaMemcpy( dest, m_devicePtr, m_size *
sizeof( devicePtrT ), cudaMemcpyDeviceToHost );
402 if( rv != cudaSuccess )
404 return internal::mxlib_error_report<verboseT>(cudaError2error_t(rv),
"cudaMemcpy");
407 return error_t::noerror;
error_t
The mxlib error codes.
Utilities for a template interface to cuda.