mirror of
https://github.com/lordmathis/CUDANet.git
synced 2025-12-24 23:34:24 +00:00
Fix some dense layer issues
This commit is contained in:
@@ -6,6 +6,11 @@ using namespace CUDANet;
|
||||
|
||||
Tensor::Tensor(Shape shape, DType dtype, Backend* backend)
|
||||
: shape(shape), dtype(dtype), backend(backend), d_ptr(nullptr) {
|
||||
|
||||
if (shape.empty()) {
|
||||
throw std::runtime_error("Tensor shape cannot be empty");
|
||||
}
|
||||
|
||||
// Count total elements
|
||||
size_t count = 1;
|
||||
for (const auto& dim : shape) {
|
||||
@@ -28,6 +33,40 @@ Tensor::Tensor(Shape shape, DType dtype, Backend* backend)
|
||||
d_ptr = backend->allocate(total_size);
|
||||
}
|
||||
|
||||
Tensor::Tensor(Tensor&& other) noexcept
|
||||
: shape(std::move(other.shape)),
|
||||
dtype(other.dtype),
|
||||
total_elms(other.total_elms),
|
||||
total_size(other.total_size),
|
||||
backend(other.backend),
|
||||
d_ptr(other.d_ptr)
|
||||
{
|
||||
other.d_ptr = nullptr;
|
||||
other.backend = nullptr;
|
||||
}
|
||||
|
||||
Tensor& Tensor::operator=(Tensor&& other) noexcept {
|
||||
if (this != &other) {
|
||||
// Clean up our current resources
|
||||
if (d_ptr != nullptr && backend != nullptr) {
|
||||
backend->deallocate(d_ptr);
|
||||
}
|
||||
|
||||
// Steal other's resources
|
||||
shape = std::move(other.shape);
|
||||
dtype = other.dtype;
|
||||
total_elms = other.total_elms;
|
||||
total_size = other.total_size;
|
||||
backend = other.backend;
|
||||
d_ptr = other.d_ptr;
|
||||
|
||||
// Leave other in valid but empty state
|
||||
other.d_ptr = nullptr;
|
||||
other.backend = nullptr;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
Tensor::~Tensor() {
|
||||
backend->deallocate(d_ptr);
|
||||
d_ptr = nullptr;
|
||||
@@ -57,5 +96,5 @@ void Tensor::zero() {
|
||||
|
||||
template <typename T>
|
||||
void Tensor::set_data(T *data) {
|
||||
backend->copy_to_device(*this, data, total_size)
|
||||
backend->copy_to_device(*this, data, total_size);
|
||||
}
|
||||
Reference in New Issue
Block a user