29 #include <cuda_runtime.h>
32 #if CUDA_VERSION <= 2010
33 #error "Require CUDA 2.2 or higher"
41 _numBytes = _numChannel = 0;
42 _imgWidth = _imgHeight = 0;
46 if (_cuData && _owner) cudaFree(_cuData);
49 void CuTexImage::ReleaseData() {
50 if (_cuData && _owner) cudaFree(_cuData);
56 if (_cuData == src.
_cuData)
return;
58 void* cuData = _cuData;
59 unsigned int numChannel = _numChannel;
60 unsigned int imgWidth = _imgWidth;
61 unsigned int imgHeight = _imgHeight;
63 size_t numBytes = _numBytes;
81 unsigned int nchannel) {
85 _numChannel = nchannel;
87 if (
size <= _numBytes)
return true;
89 if (_cuData && _owner) cudaFree(_cuData);
92 cudaError_t e = cudaMalloc(&_cuData,
size);
93 _numBytes = e == cudaSuccess ?
size : 0;
95 return e == cudaSuccess;
98 void CuTexImage::SetTexture(
void* data,
unsigned int width,
99 unsigned int nchannel) {
100 if (_cuData && _owner) cudaFree(_cuData);
103 _numChannel = nchannel;
104 _numBytes =
sizeof(float) *
width * _imgHeight * _numChannel;
110 if (_cuData ==
NULL || buf ==
NULL || GetDataSize() == 0)
return;
111 cudaMemcpy(_cuData, buf, _imgWidth * _imgHeight * _numChannel *
sizeof(
float),
112 cudaMemcpyHostToDevice);
115 void CuTexImage::CopyFromDevice(
const void* buf) {
116 if (_cuData ==
NULL)
return;
117 cudaMemcpy((
char*)_cuData, buf,
118 _imgWidth * _imgHeight * _numChannel *
sizeof(
float),
119 cudaMemcpyDeviceToDevice);
123 if (_cuData ==
NULL)
return;
124 size_t sz = _imgWidth * _imgHeight * _numChannel *
sizeof(float);
126 cudaMemcpy(buf, _cuData, sz, cudaMemcpyDeviceToHost);
127 cudaDeviceSynchronize();
132 void CuTexImage::SaveToFile(
const char*
name) {
134 vector<float> value(GetLength());
135 CopyToHost(&value[0]);
136 for (
size_t i = 0; i < value.size(); ++i) out << value[i] <<
'\n';
void CopyFromHost(const void *buf)
void CopyToHost(void *buf)
virtual bool InitTexture(int width, int height, int nchannel=1)