| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef COLMAP_SRC_MVS_CUDA_ARRAY_WRAPPER_H_ |
| | #define COLMAP_SRC_MVS_CUDA_ARRAY_WRAPPER_H_ |
| |
|
| | #include <memory> |
| |
|
| | #include <cuda_runtime.h> |
| |
|
| | #include "mvs/gpu_mat.h" |
| | #include "util/cudacc.h" |
| |
|
| | namespace colmap { |
| | namespace mvs { |
| |
|
| | template <typename T> |
| | class CudaArrayWrapper { |
| | public: |
| | CudaArrayWrapper(const size_t width, const size_t height, const size_t depth); |
| | ~CudaArrayWrapper(); |
| |
|
| | const cudaArray* GetPtr() const; |
| | cudaArray* GetPtr(); |
| |
|
| | size_t GetWidth() const; |
| | size_t GetHeight() const; |
| | size_t GetDepth() const; |
| |
|
| | void CopyToDevice(const T* data); |
| | void CopyToHost(const T* data); |
| | void CopyFromGpuMat(const GpuMat<T>& array); |
| |
|
| | private: |
| | |
| | CudaArrayWrapper(CudaArrayWrapper const&) = delete; |
| | void operator=(CudaArrayWrapper const& obj) = delete; |
| | CudaArrayWrapper(CudaArrayWrapper&&) = delete; |
| |
|
| | void Allocate(); |
| | void Deallocate(); |
| |
|
| | cudaArray* array_; |
| |
|
| | size_t width_; |
| | size_t height_; |
| | size_t depth_; |
| | }; |
| |
|
| | |
| | |
| | |
| |
|
| | template <typename T> |
| | CudaArrayWrapper<T>::CudaArrayWrapper(const size_t width, const size_t height, |
| | const size_t depth) |
| | : width_(width), height_(height), depth_(depth), array_(nullptr) {} |
| |
|
| | template <typename T> |
| | CudaArrayWrapper<T>::~CudaArrayWrapper() { |
| | Deallocate(); |
| | } |
| |
|
| | template <typename T> |
| | const cudaArray* CudaArrayWrapper<T>::GetPtr() const { |
| | return array_; |
| | } |
| |
|
| | template <typename T> |
| | cudaArray* CudaArrayWrapper<T>::GetPtr() { |
| | return array_; |
| | } |
| |
|
| | template <typename T> |
| | size_t CudaArrayWrapper<T>::GetWidth() const { |
| | return width_; |
| | } |
| |
|
| | template <typename T> |
| | size_t CudaArrayWrapper<T>::GetHeight() const { |
| | return height_; |
| | } |
| |
|
| | template <typename T> |
| | size_t CudaArrayWrapper<T>::GetDepth() const { |
| | return depth_; |
| | } |
| |
|
| | template <typename T> |
| | void CudaArrayWrapper<T>::CopyToDevice(const T* data) { |
| | cudaMemcpy3DParms params = {0}; |
| | Allocate(); |
| | params.extent = make_cudaExtent(width_, height_, depth_); |
| | params.kind = cudaMemcpyHostToDevice; |
| | params.dstArray = array_; |
| | params.srcPtr = |
| | make_cudaPitchedPtr((void*)data, width_ * sizeof(T), width_, height_); |
| | CUDA_SAFE_CALL(cudaMemcpy3D(¶ms)); |
| | } |
| |
|
| | template <typename T> |
| | void CudaArrayWrapper<T>::CopyToHost(const T* data) { |
| | cudaMemcpy3DParms params = {0}; |
| | params.extent = make_cudaExtent(width_, height_, depth_); |
| | params.kind = cudaMemcpyDeviceToHost; |
| | params.dstPtr = |
| | make_cudaPitchedPtr((void*)data, width_ * sizeof(T), width_, height_); |
| | params.srcArray = array_; |
| | CUDA_SAFE_CALL(cudaMemcpy3D(¶ms)); |
| | } |
| |
|
| | template <typename T> |
| | void CudaArrayWrapper<T>::CopyFromGpuMat(const GpuMat<T>& array) { |
| | Allocate(); |
| | cudaMemcpy3DParms parameters = {0}; |
| | parameters.extent = make_cudaExtent(width_, height_, depth_); |
| | parameters.kind = cudaMemcpyDeviceToDevice; |
| | parameters.dstArray = array_; |
| | parameters.srcPtr = make_cudaPitchedPtr((void*)array.GetPtr(), |
| | array.GetPitch(), width_, height_); |
| | CUDA_SAFE_CALL(cudaMemcpy3D(¶meters)); |
| | } |
| |
|
| | template <typename T> |
| | void CudaArrayWrapper<T>::Allocate() { |
| | Deallocate(); |
| | struct cudaExtent extent = make_cudaExtent(width_, height_, depth_); |
| | cudaChannelFormatDesc fmt = cudaCreateChannelDesc<T>(); |
| | CUDA_SAFE_CALL(cudaMalloc3DArray(&array_, &fmt, extent, cudaArrayLayered)); |
| | } |
| |
|
| | template <typename T> |
| | void CudaArrayWrapper<T>::Deallocate() { |
| | if (array_ != nullptr) { |
| | CUDA_SAFE_CALL(cudaFreeArray(array_)); |
| | array_ = nullptr; |
| | } |
| | } |
| |
|
| | } |
| | } |
| |
|
| | #endif |
| |
|