39 #ifndef ECUDA_APIWRAPPERS_HPP
40 #define ECUDA_APIWRAPPERS_HPP
62 inline cudaError_t
cudaMemcpy( T* dest,
const T* src,
const size_t count, cudaMemcpyKind kind )
64 return ::cudaMemcpy( reinterpret_cast<void*>(dest), reinterpret_cast<const void*>(src),
sizeof(T)*count, kind );
84 inline cudaError_t
cudaMemcpy2D( T* dest,
const size_t dpitch,
const T* src,
const size_t spitch,
const size_t width,
const size_t height, cudaMemcpyKind kind )
86 return ::cudaMemcpy2D( reinterpret_cast<void*>(dest), dpitch, reinterpret_cast<const void*>(src), spitch, width*
sizeof(T), height, kind );
102 bool is_equal_bytes(
const T& value )
104 const char* p =
reinterpret_cast<const char*
>(&value);
105 const char* q = p; ++q;
106 for(
int i = 1; i <
sizeof(T); ++i, ++q )
if( *p != *q )
return false;
150 if( impl::is_equal_bytes(value) ) {
151 return cudaMemset( reinterpret_cast<char*>(devPtr), *reinterpret_cast<const char*>(&value), count*
sizeof(T) );
153 std::vector< T, host_allocator<T> > v( count, value );
154 return cudaMemcpy<T>( devPtr, &v.front(),
count, cudaMemcpyHostToDevice );
170 inline cudaError_t
cudaMemset2D(
char* devPtr,
const size_t pitch,
const char& value,
const size_t width,
const size_t height )
195 cudaError_t
cudaMemset2D( T* devPtr,
const size_t pitch,
const T& value,
const size_t width,
const size_t height )
197 if( impl::is_equal_bytes(value) ) {
198 return cudaMemset2D( reinterpret_cast<char*>(devPtr), pitch, *reinterpret_cast<const char*>(&value), width*
sizeof(T), height );
200 std::vector< T, host_allocator<T> > v( width, value );
201 char* charPtr =
reinterpret_cast<char*
>(devPtr);
202 for( std::size_t i = 0; i < height; ++i, charPtr += pitch ) {
203 const cudaError_t rc = cudaMemcpy<T>(
reinterpret_cast<T*
>(charPtr), &v.front(), width, cudaMemcpyHostToDevice );
204 if( rc != cudaSuccess )
return rc;
210 inline cudaError_t
cudaMemcpyToSymbol( T* dest,
const T* src,
size_t count=1,
size_t offset=0,
enum cudaMemcpyKind kind=cudaMemcpyHostToDevice )
216 inline cudaError_t
cudaMemcpyToSymbol( T& dest,
const T& src,
enum cudaMemcpyKind kind=cudaMemcpyHostToDevice )
cudaError_t cudaMemset(char *devPtr, const char &value, const size_t count)
Re-implementation of CUDA API function cudaMemset that enforces a single-byte value.
cudaError_t cudaMemset2D(char *devPtr, const size_t pitch, const char &value, const size_t width, const size_t height)
Re-implementation of CUDA API function cudaMemset2D that enforces a single-byte value.
cudaError_t cudaMemset(T *devPtr, const T &value, const size_t count)
Re-implementation of CUDA API function cudaMemset that allows for any data type.
cudaError_t cudaMemcpyToSymbol(T *dest, const T *src, size_t count=1, size_t offset=0, enum cudaMemcpyKind kind=cudaMemcpyHostToDevice)
cudaError_t cudaMemcpy(T *dest, const T *src, const size_t count, cudaMemcpyKind kind)
Wrapper around CUDA API function cudaMemcpy.
cudaError_t cudaMemcpy2D(T *dest, const size_t dpitch, const T *src, const size_t spitch, const size_t width, const size_t height, cudaMemcpyKind kind)
Wrapper around CUDA API function cudaMemcpy2D.
cudaError_t cudaMemset2D(T *devPtr, const size_t pitch, const T &value, const size_t width, const size_t height)
Re-implementation of CUDA API function cudaMemset2D that allows for any data type.
__DEVICE__ void threadfence()
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ ecuda::iterator_traits< InputIterator >::difference_type count(InputIterator first, InputIterator last, const T &value)
cudaError_t cudaMemcpyToSymbol(T &dest, const T &src, enum cudaMemcpyKind kind=cudaMemcpyHostToDevice)