#include "gtest/gtest.h" #include "kompute/Kompute.hpp" TEST(TestOpTensorCopy, CopyDeviceToDeviceTensor) { kp::Manager mgr; std::vector testVecA{ 1, 2, 3 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; mgr.rebuild({ tensorA, tensorB }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.evalOpDefault({ tensorA, tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); // Making sure the GPU holds the same data mgr.evalOpDefault({ tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); } TEST(TestOpTensorCopy, CopyDeviceToDeviceTensorMulti) { kp::Manager mgr; std::vector testVecA{ 2, 3, 4 }; std::vector testVecB{ 0, 0, 0 }; std::vector testVecC{ 0, 0, 0 }; std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; std::shared_ptr tensorC{ new kp::Tensor(testVecC) }; mgr.rebuild({ tensorA, tensorB, tensorC }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); EXPECT_TRUE(tensorC->isInit()); mgr.evalOpDefault({ tensorA, tensorB, tensorC }); EXPECT_EQ(tensorA->data(), tensorB->data()); EXPECT_EQ(tensorA->data(), tensorC->data()); // Making sure the GPU holds the same data mgr.evalOpDefault({ tensorB, tensorC }); EXPECT_EQ(tensorA->data(), tensorB->data()); EXPECT_EQ(tensorA->data(), tensorC->data()); } TEST(TestOpTensorCopy, CopyDeviceToHostTensor) { kp::Manager mgr; std::vector testVecA{ 3, 4, 5 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr tensorA{ new kp::Tensor(testVecA) }; std::shared_ptr tensorB{ new kp::Tensor( testVecB, kp::Tensor::TensorTypes::eHost) }; mgr.rebuild({ tensorA, tensorB }, false); // Only calling sync on device type tensor mgr.evalOpDefault({ tensorA }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.evalOpDefault({ tensorA, tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); // Making sure the GPU holds the same data mgr.evalOpDefault({ tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); } TEST(TestOpTensorCopy, CopyHostToDeviceTensor) { kp::Manager mgr; std::vector testVecA{ 4, 5, 6 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr tensorA{ new kp::Tensor( testVecA, kp::Tensor::TensorTypes::eHost) }; std::shared_ptr tensorB{ new kp::Tensor(testVecB) }; mgr.rebuild({ tensorA, tensorB }, false); // Manually copy data into host memory of Tensor tensorA->mapDataIntoHostMemory(); // Only calling sync on device type tensor mgr.evalOpDefault({ tensorB }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.evalOpDefault({ tensorA, tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); // Making sure the GPU holds the same data mgr.evalOpDefault({ tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); } TEST(TestOpTensorCopy, CopyHostToHostTensor) { kp::Manager mgr; std::vector testVecA{ 5, 6, 7 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr tensorA{ new kp::Tensor( testVecA, kp::Tensor::TensorTypes::eHost) }; std::shared_ptr tensorB{ new kp::Tensor( testVecB, kp::Tensor::TensorTypes::eHost) }; mgr.rebuild({ tensorA, tensorB }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.evalOpDefault({ tensorA, tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); // Making sure the GPU holds the same data mgr.evalOpDefault({ tensorB }); EXPECT_EQ(tensorA->data(), tensorB->data()); } TEST(TestOpTensorCopy, SingleTensorShouldFail) { kp::Manager mgr; std::vector testVecA{ 6, 7, 8 }; std::shared_ptr tensorA{ new kp::Tensor( testVecA, kp::Tensor::TensorTypes::eHost) }; mgr.rebuild({ tensorA }, false); EXPECT_TRUE(tensorA->isInit()); EXPECT_THROW(mgr.evalOpDefault({ tensorA }), std::runtime_error); }