// SPDX-License-Identifier: Apache-2.0 #include "gtest/gtest.h" #include "kompute/Kompute.hpp" #include "shaders/Utils.hpp" TEST(TestOpTensorCopy, CopyDeviceToDeviceTensor) { kp::Manager mgr; std::vector testVecA{ 1, 2, 3 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr> tensorA = mgr.tensor(testVecA); std::shared_ptr> tensorB = mgr.tensor(testVecB); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.sequence() ->eval({ tensorA, tensorB }) ->eval({ tensorA, tensorB }) ->eval({ tensorA, tensorB }); // Making sure the GPU holds the same vector EXPECT_EQ(tensorA->vector(), tensorB->vector()); } 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 = mgr.tensor(testVecA); std::shared_ptr> tensorB = mgr.tensor(testVecB); std::shared_ptr> tensorC = mgr.tensor(testVecC); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); EXPECT_TRUE(tensorC->isInit()); mgr.sequence() ->eval({ tensorA, tensorB, tensorC }) ->eval({ tensorA, tensorB, tensorC }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); EXPECT_EQ(tensorA->vector(), tensorC->vector()); // Making sure the GPU holds the same vector mgr.sequence()->eval({ tensorB, tensorC }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); EXPECT_EQ(tensorA->vector(), tensorC->vector()); } TEST(TestOpTensorCopy, CopyDeviceToHostTensor) { kp::Manager mgr; std::vector testVecA{ 3, 4, 5 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr> tensorA = mgr.tensor(testVecA); std::shared_ptr> tensorB = mgr.tensor(testVecB, kp::Tensor::TensorTypes::eHost); // Only calling sync on device type tensor mgr.sequence()->eval({ tensorA }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.sequence()->eval({ tensorA, tensorB }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); // Making sure the GPU holds the same vector mgr.sequence()->eval({ tensorB }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); } TEST(TestOpTensorCopy, CopyHostToDeviceTensor) { kp::Manager mgr; std::vector testVecA{ 4, 5, 6 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr> tensorA = mgr.tensor(testVecA, kp::Tensor::TensorTypes::eHost); std::shared_ptr> tensorB = mgr.tensor(testVecB); // Only calling sync on device type tensor mgr.sequence()->eval({ tensorA, tensorB }); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.sequence()->eval({ tensorA, tensorB }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); // Making sure the GPU holds the same vector mgr.sequence()->eval({ tensorB }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); } TEST(TestOpTensorCopy, CopyHostToHostTensor) { kp::Manager mgr; std::vector testVecA{ 5, 6, 7 }; std::vector testVecB{ 0, 0, 0 }; std::shared_ptr> tensorA = mgr.tensor(testVecA, kp::Tensor::TensorTypes::eHost); std::shared_ptr> tensorB = mgr.tensor(testVecB, kp::Tensor::TensorTypes::eHost); EXPECT_TRUE(tensorA->isInit()); EXPECT_TRUE(tensorB->isInit()); mgr.sequence() ->eval({ tensorA }) ->eval({ tensorA, tensorB }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); // Making sure the GPU holds the same vector mgr.sequence()->eval({ tensorB }); EXPECT_EQ(tensorA->vector(), tensorB->vector()); } TEST(TestOpTensorCopy, SingleTensorShouldFail) { kp::Manager mgr; std::vector testVecA{ 6, 7, 8 }; std::shared_ptr> tensorA = mgr.tensor(testVecA, kp::Tensor::TensorTypes::eHost); EXPECT_TRUE(tensorA->isInit()); EXPECT_THROW(mgr.sequence()->eval({ tensorA }), std::runtime_error); } int main(int argc, char* argv[]) { testing::InitGoogleTest(&argc, argv); #if KOMPUTE_ENABLE_SPDLOG spdlog::set_level( static_cast(KOMPUTE_LOG_LEVEL)); #endif return RUN_ALL_TESTS(); }