From 321ee7b7f199deec6a0dd6b49bdbccf1955d8b90 Mon Sep 17 00:00:00 2001 From: Giovanni LB Date: Tue, 5 Sep 2023 13:29:28 -0300 Subject: [PATCH] SWDEV-419972: Fixing multiprocess test. Moved codeobj test above ATT test. Change-Id: Ib877bfb721bf4c4b0b1c26dcc69a277f6b89012f --- .../featuretests/profiler/profiler_gtest.cpp | 390 +++++++----------- 1 file changed, 159 insertions(+), 231 deletions(-) diff --git a/tests-v2/featuretests/profiler/profiler_gtest.cpp b/tests-v2/featuretests/profiler/profiler_gtest.cpp index 9357da9060..f770bbe8b2 100644 --- a/tests-v2/featuretests/profiler/profiler_gtest.cpp +++ b/tests-v2/featuretests/profiler/profiler_gtest.cpp @@ -536,6 +536,146 @@ TEST_F(LoadUnloadTest, WhenLoadingSecondTimeThenToolLoadsUnloadsSuccessfully) { EXPECT_EQ(HSA_STATUS_SUCCESS, status); } + +/* + * ################################################### + * ############ Codeobj capture tests ################ + * ################################################### + */ + +class CodeobjTest : public ::testing::Test { + public: + virtual void SetUp(const char* app_name){}; + virtual void TearDown(){}; + static void FlushCallback(const rocprofiler_record_header_t* record, + const rocprofiler_record_header_t* end_record, + rocprofiler_session_id_t session_id, + rocprofiler_buffer_id_t buffer_id){}; + + void SetupRocprofiler() { + int result = ROCPROFILER_STATUS_ERROR; + + result = rocprofiler_initialize(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + result = rocprofiler_create_session(ROCPROFILER_NONE_REPLAY_MODE, &session_id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_create(&id, ROCPROFILER_CAPTURE_SYMBOLS_ONLY, 0); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + } + + void TearDownRocprofiler() { + int result = ROCPROFILER_STATUS_ERROR; + + result = rocprofiler_codeobj_capture_free(id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_destroy_session(session_id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + result = rocprofiler_finalize(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + } + + rocprofiler_session_id_t session_id; + rocprofiler_record_id_t id; +}; + +TEST_F(CodeobjTest, WhenRunningProfilerWithCodeobjCapture) { + int result = ROCPROFILER_STATUS_ERROR; + SetupRocprofiler(); + + result = rocprofiler_codeobj_capture_start(id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + // Launch a kernel + LaunchVectorAddKernel(); + + result = rocprofiler_codeobj_capture_stop(id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + rocprofiler_codeobj_symbols_t capture; + + rocprofiler_codeobj_capture_get(id, &capture); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + EXPECT_GE(capture.count, 1); + bool bCaptured_itself = false; + + for (int i = 0; i < (int)capture.count; i++) { + const char* path = capture.symbols[i].filepath; + if (!path) continue; + std::string fpath(path); + size_t pos = fpath.find("runFeatureTests#offset="); + if (pos != std::string::npos && fpath.find("&size=", pos) != std::string::npos) + bCaptured_itself = true; + } + EXPECT_EQ(bCaptured_itself, true); + + TearDownRocprofiler(); +} + + +TEST_F(CodeobjTest, WhenRunningProfilerWithMultipleCaptureAndCopy) { + int result = ROCPROFILER_STATUS_ERROR; + + SetupRocprofiler(); + + rocprofiler_record_id_t id2; + rocprofiler_record_id_t id3; + + result = rocprofiler_codeobj_capture_create(&id2, ROCPROFILER_CAPTURE_COPY_FILE_AND_MEMORY, 0); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_start(id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_start(id2); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_create(&id3, ROCPROFILER_CAPTURE_COPY_MEMORY, 0); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_start(id3); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + // Launch a kernel + LaunchVectorAddKernel(); + + result = rocprofiler_codeobj_capture_stop(id2); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_stop(id3); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_free(id3); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + rocprofiler_codeobj_symbols_t capture; + rocprofiler_codeobj_capture_get(id2, &capture); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + EXPECT_GE(capture.count, 1); + + for (int i = 0; i < (int)capture.count; i++) { + EXPECT_NE(capture.symbols[i].base_address, 0); + EXPECT_NE(capture.symbols[i].clock_start.value, 0); + EXPECT_NE(capture.symbols[i].data, nullptr); + EXPECT_NE(capture.symbols[i].size, 0); + } + + result = rocprofiler_codeobj_capture_stop(id); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + result = rocprofiler_codeobj_capture_free(id2); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); + + // Expect to return error when running get() after free() + result = rocprofiler_codeobj_capture_get(id3, &capture); + EXPECT_NE(ROCPROFILER_STATUS_SUCCESS, result); + + TearDownRocprofiler(); +} + /* * ################################################### * ############ ATT Tests ################ @@ -593,36 +733,11 @@ class ATTCollection : public ::testing::Test { bool ATTCollection::bCollected = false; TEST_F(ATTCollection, WhenRunningATTItCollectsTraceDataWithOldAPI) { - // iterate for gpu's - struct agent_info { - std::vector agents = {}; - - auto as_string() const { - auto _ss = std::stringstream{}; - for (const auto& itr : agents) _ss << ", " << itr; - auto _v = _ss.str(); - if (_v.length() > 2) return _v.substr(2); - return _v; - } - }; - - auto _info = agent_info{}; - hsa_iterate_agents( - [](hsa_agent_t agent, void* _arg) { - agent_info* _info_v = static_cast(_arg); - EXPECT_NE(_info_v, nullptr); - char gpu_name[64] = {'\0'}; - hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, gpu_name); - _info_v->agents.emplace_back(std::string{gpu_name}); - return HSA_STATUS_SUCCESS; - }, - static_cast(&_info)); - int result = ROCPROFILER_STATUS_ERROR; // inititalize ROCProfiler result = rocprofiler_initialize(); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // Att trace collection parameters rocprofiler_session_id_t session_id; @@ -635,12 +750,12 @@ TEST_F(ATTCollection, WhenRunningATTItCollectsTraceDataWithOldAPI) { // create a session result = rocprofiler_create_session(ROCPROFILER_NONE_REPLAY_MODE, &session_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // create a buffer to hold att trace records for each kernel launch rocprofiler_buffer_id_t buffer_id; result = rocprofiler_create_buffer(session_id, FlushCallback, 0x9999, &buffer_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // create a filter for collecting att traces rocprofiler_filter_id_t filter_id; @@ -648,67 +763,42 @@ TEST_F(ATTCollection, WhenRunningATTItCollectsTraceDataWithOldAPI) { result = rocprofiler_create_filter(session_id, ROCPROFILER_ATT_TRACE_COLLECTION, rocprofiler_filter_data_t{.att_parameters = ¶meters[0]}, parameters.size(), &filter_id, property); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // set buffer for the filter result = rocprofiler_set_filter_buffer(session_id, filter_id, buffer_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // activating att tracing session result = rocprofiler_start_session(session_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // Launch a kernel LaunchVectorAddKernel(); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // deactivate att tracing session result = rocprofiler_terminate_session(session_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // dump att tracing data result = rocprofiler_flush_data(session_id, buffer_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // destroy session result = rocprofiler_destroy_session(session_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // finalize att tracing by destroying rocprofiler object result = rocprofiler_finalize(); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result) << "agents: " << _info.as_string(); + EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); // check if we got data from any shader engine - EXPECT_EQ(bCollected, true) << "agents: " << _info.as_string(); + EXPECT_EQ(bCollected, true); } // New API TEST_F(ATTCollection, WhenRunningATTItCollectsTraceDataWithNewAPI) { - // iterate for gpu's - struct agent_info { - std::vector agents = {}; - - auto as_string() const { - auto _ss = std::stringstream{}; - for (const auto& itr : agents) _ss << ", " << itr; - auto _v = _ss.str(); - if (_v.length() > 2) return _v.substr(2); - return _v; - } - }; - - auto _info = agent_info{}; - hsa_iterate_agents( - [](hsa_agent_t agent, void* _arg) { - agent_info* _info_v = static_cast(_arg); - EXPECT_NE(_info_v, nullptr); - char gpu_name[64] = {'\0'}; - hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, gpu_name); - _info_v->agents.emplace_back(std::string{gpu_name}); - return HSA_STATUS_SUCCESS; - }, - static_cast(&_info)); - int result = ROCPROFILER_STATUS_ERROR; // inititalize ROCProfiler result = rocprofiler_initialize(); @@ -1096,180 +1186,18 @@ TEST_F(ProfilerMQTest, DISABLED_WhenRunningMultiProcessTestItPasses) { * ############ Multi Process Tests ################ * ################################################### */ - TEST(ProfilerMPTest, WhenRunningMultiProcessTestItPasses) { - // create as many threads as number of cores in system - int num_cpu_cores = GetNumberOfCores(); + int num_threads = 3; // Create 3 threads pid_t childpid = fork(); - if (childpid > 0) { // Parent - // create a pool of thrads - std::vector threads(num_cpu_cores); - for (int n = 0; n < num_cpu_cores / 2; ++n) { - threads[n] = std::thread(KernelLaunch); - } - for (int n = 0; n < num_cpu_cores / 2; ++n) { - threads[n].join(); - } - // wait for child exit - wait(NULL); - exit(0); + if (childpid != 0) wait(NULL); // Need to wait for child. - - } else if (!childpid) { // child - // create a pool of thrads - std::vector threads(num_cpu_cores); - for (int n = 0; n < num_cpu_cores / 2; ++n) { - threads[n] = std::thread(KernelLaunch); - } - - for (int n = 0; n < num_cpu_cores / 2; ++n) { - threads[n].join(); - exit(0); - } - } else { // failure - ASSERT_TRUE(1); - } -} - -/* - * ################################################### - * ############ Codeobj capture tests ################ - * ################################################### - */ - -class CodeobjTest : public ::testing::Test { - public: - virtual void SetUp(const char* app_name){}; - virtual void TearDown(){}; - static void FlushCallback(const rocprofiler_record_header_t* record, - const rocprofiler_record_header_t* end_record, - rocprofiler_session_id_t session_id, - rocprofiler_buffer_id_t buffer_id){}; - - void SetupRocprofiler() { - int result = ROCPROFILER_STATUS_ERROR; - - result = rocprofiler_initialize(); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - result = rocprofiler_create_session(ROCPROFILER_NONE_REPLAY_MODE, &session_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_create(&id, ROCPROFILER_CAPTURE_SYMBOLS_ONLY, 0); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - } - - void TearDownRocprofiler() { - int result = ROCPROFILER_STATUS_ERROR; - - result = rocprofiler_codeobj_capture_free(id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_destroy_session(session_id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - result = rocprofiler_finalize(); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - } - - rocprofiler_session_id_t session_id; - rocprofiler_record_id_t id; -}; - -TEST_F(CodeobjTest, WhenRunningProfilerWithCodeobjCapture) { - int result = ROCPROFILER_STATUS_ERROR; - SetupRocprofiler(); - - result = rocprofiler_codeobj_capture_start(id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - // Launch a kernel - LaunchVectorAddKernel(); - - result = rocprofiler_codeobj_capture_stop(id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - rocprofiler_codeobj_symbols_t capture; - - rocprofiler_codeobj_capture_get(id, &capture); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - EXPECT_GE(capture.count, 1); - bool bCaptured_itself = false; - - for (int i = 0; i < (int)capture.count; i++) { - const char* path = capture.symbols[i].filepath; - if (!path) continue; - std::string fpath(path); - size_t pos = fpath.find("runFeatureTests#offset="); - if (pos != std::string::npos && fpath.find("&size=", pos) != std::string::npos) - bCaptured_itself = true; - } - EXPECT_EQ(bCaptured_itself, true); - - TearDownRocprofiler(); -} - - -TEST_F(CodeobjTest, WhenRunningProfilerWithMultipleCaptureAndCopy) { - int result = ROCPROFILER_STATUS_ERROR; - - SetupRocprofiler(); - - rocprofiler_record_id_t id2; - rocprofiler_record_id_t id3; - - result = rocprofiler_codeobj_capture_create(&id2, ROCPROFILER_CAPTURE_COPY_FILE_AND_MEMORY, 0); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_start(id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_start(id2); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_create(&id3, ROCPROFILER_CAPTURE_COPY_MEMORY, 0); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_start(id3); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - // Launch a kernel - LaunchVectorAddKernel(); - - result = rocprofiler_codeobj_capture_stop(id2); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_stop(id3); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_free(id3); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - rocprofiler_codeobj_symbols_t capture; - rocprofiler_codeobj_capture_get(id2, &capture); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - EXPECT_GE(capture.count, 1); - - for (int i = 0; i < (int)capture.count; i++) { - EXPECT_NE(capture.symbols[i].base_address, 0); - EXPECT_NE(capture.symbols[i].clock_start.value, 0); - EXPECT_NE(capture.symbols[i].data, nullptr); - EXPECT_NE(capture.symbols[i].size, 0); - } - - result = rocprofiler_codeobj_capture_stop(id); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - result = rocprofiler_codeobj_capture_free(id2); - EXPECT_EQ(ROCPROFILER_STATUS_SUCCESS, result); - - // Expect to return error when running get() after free() - result = rocprofiler_codeobj_capture_get(id3, &capture); - EXPECT_NE(ROCPROFILER_STATUS_SUCCESS, result); - - TearDownRocprofiler(); + std::vector threads(num_threads); + for (auto& thread : threads) + thread = std::move(std::thread(KernelLaunch)); + for (auto& thread : threads) + thread.join(); } /*