diff --git a/include/aidge/backend/cpu/data/TensorImpl.hpp b/include/aidge/backend/cpu/data/TensorImpl.hpp
index dd31088d136cc03278ecf23cae4dc15165017b29..9de5210cfffc2b1bb24061eb1a4c5fea02103694 100644
--- a/include/aidge/backend/cpu/data/TensorImpl.hpp
+++ b/include/aidge/backend/cpu/data/TensorImpl.hpp
@@ -44,16 +44,17 @@ class TensorImpl_cpu : public TensorImpl {
     // native interface
     const future_std::span<T>& data() const { return mData; }
 
+    std::size_t size() const override { return mData.size(); }
     std::size_t scalarSize() const override { return sizeof(T); }
 
     void setDevice(int device) override {
         AIDGE_ASSERT(device == 0, "device cannot be != 0 for CPU backend");
     }
 
-    void copy(const void *src, NbElts_t length) override {
+    void copy(const void *src, NbElts_t length, NbElts_t offset = 0) override {
         AIDGE_ASSERT(length <= mData.size() || length <= mTensor.size(), "copy length is above capacity");
         std::copy(static_cast<const T *>(src), static_cast<const T *>(src) + length,
-                  static_cast<T *>(rawPtr()));
+                  static_cast<T *>(rawPtr()) + offset);
     }
 
     void copyCast(const void *src, NbElts_t length, const DataType srcDt) override {
@@ -148,19 +149,19 @@ class TensorImpl_cpu : public TensorImpl {
         return mData.data();
     };
 
-    void* getRaw(std::size_t idx) {
+    void* getRawPtr(NbElts_t idx) override final {
         AIDGE_ASSERT(idx < mData.size(), "idx out of range");
-        return  static_cast<void*>(static_cast<T *>(rawPtr()) + idx);
+        return static_cast<void*>(static_cast<T*>(rawPtr()) + idx);
     };
 
-    virtual ~TensorImpl_cpu() = default;
-
     void setRawPtr(void *ptr, NbElts_t length) override final {
         AIDGE_ASSERT(length >= mTensor.size(), "trying to set raw pointer of insufficient capacity");
         mData = future_std::span<T>(static_cast<T *>(ptr), length);
         mDataOwner.reset();
     };
 
+    virtual ~TensorImpl_cpu() = default;
+
 private:
     void lazyInit() {
         if (mData.size() < mTensor.size()) {
diff --git a/src/operator/FCImpl.cpp b/src/operator/FCImpl.cpp
index 90cf3ea54b7032848cb8b555f01f2500e50df447..bc4a7a7cab91049c623e9a9e95ee63367da00722 100644
--- a/src/operator/FCImpl.cpp
+++ b/src/operator/FCImpl.cpp
@@ -58,8 +58,8 @@ void Aidge::FCImpl_cpu::forward()
 
     // Call kernel
     kernelFunc(dynamic_cast<const FC_Op&>(mOp).getStaticAttributes(),
-        std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims()[0],
-        std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->sizeM1(),
+        input0.dims()[0],
+        input0.size() / input0.dims()[0],
         input0.getImpl()->rawPtr(), input1.getImpl()->rawPtr(), input2.getImpl()->rawPtr(),
         getCPUPtr(mOp.getRawOutput(0)));
 }
diff --git a/src/operator/MatMulImpl.cpp b/src/operator/MatMulImpl.cpp
index 1abd75db070bbd3b197519318f5bf23c7b46ee5a..f02effb3172e2c0624c6c7532513a2b794ee3a89 100644
--- a/src/operator/MatMulImpl.cpp
+++ b/src/operator/MatMulImpl.cpp
@@ -47,7 +47,7 @@ void Aidge::MatMulImpl_cpu::forward()
     kernelFunc(
         dynamic_cast<const MatMul_Op&>(mOp).getStaticAttributes(),
         std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims()[0],
-        std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->sizeM1(),
+        std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->size() / std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims()[0],
         getCPUPtr(mOp.getRawInput(0)),
         getCPUPtr(mOp.getRawInput(1)),
         getCPUPtr(mOp.getRawOutput(0)));
diff --git a/src/operator/SoftmaxImpl.cpp b/src/operator/SoftmaxImpl.cpp
index 428d32fc7a4c1a2b639d4f78601c78ab41376b47..c3086d8f9067996b9b0a8546b6deb3e281c777b4 100644
--- a/src/operator/SoftmaxImpl.cpp
+++ b/src/operator/SoftmaxImpl.cpp
@@ -38,7 +38,7 @@ void Aidge::SoftmaxImpl_cpu::forward() {
 
     DimSize_t batchSize = std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims()[0];
     DimSize_t channelSize = std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims()[1];
-    DimSize_t featureSize = std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->sizeM1()/channelSize;
+    DimSize_t featureSize = (std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->size()/batchSize)/channelSize;
     // Call kernel
     kernelFunc(batchSize,
                channelSize,