// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #ifdef ROCROLLER_USE_HIP #include #include #endif /* ROCROLLER_USE_HIP */ #include #include "GPUContextFixture.hpp" using namespace rocRoller; namespace StreamTest { class StreamTest : public CurrentGPUContextFixture { void SetUp() override { CurrentGPUContextFixture::SetUp(); } }; TEST_F(StreamTest, AsyncStream) { auto const nx = 4096; RandomGenerator random(31415u); auto a = random.vector(nx, -100, 100); auto b = random.vector(nx, -100, 100); auto d_a = make_shared_device(a); auto d_b = make_shared_device(b); auto d_c = make_shared_device(nx); auto d_alpha = make_shared_device(); int alpha = 22; std::vector r(nx); ASSERT_THAT(hipMemcpy(d_alpha.get(), &alpha, 1 * sizeof(int), hipMemcpyDefault), HasHipSuccess(0)); auto vectorAdd = rocRollerTest::Graphs::VectorAdd(); CommandKernel commandKernel(vectorAdd.getCommand(), "VectorAdd"); commandKernel.setContext(m_context); commandKernel.generateKernel(); auto runtimeArgs = vectorAdd.getRuntimeArguments(nx, d_alpha.get(), d_a.get(), d_b.get(), d_c.get()); // Launch the kernel on a new stream instead of the default one hipStream_t stream; ASSERT_THAT(hipStreamCreate(&stream), HasHipSuccess(0)); commandKernel.launchKernel(runtimeArgs.runtimeArguments(), stream); ASSERT_THAT(hipStreamSynchronize(stream), HasHipSuccess(0)); ASSERT_THAT(hipMemcpy(r.data(), d_c.get(), nx * sizeof(int), hipMemcpyDefault), HasHipSuccess(0)); // reference solution auto tol = AcceptableError{5 * std::sqrt(nx) * epsilon(), "Sqrt(N) * epsilon"}; auto res = compare(r, vectorAdd.referenceSolution(alpha, a, b), tol); EXPECT_TRUE(res.ok) << res.message(); ASSERT_THAT(hipStreamDestroy(stream), HasHipSuccess(0)); } }