chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 12:40:42 +08:00
commit e25996e7db
15472 changed files with 3536181 additions and 0 deletions
@@ -0,0 +1,16 @@
cc_test(
test_event_node
SRCS test_event_node.cc
DEPS event_node profiler_logger)
cc_test(
test_extra_info
SRCS test_extra_info.cc
DEPS phi glog common)
cc_test(
test_serialization_logger
SRCS dump/test_serialization_logger.cc
DEPS event_bind)
cc_test(
new_profiler_test
SRCS profiler_test.cc
DEPS new_profiler)
@@ -0,0 +1,315 @@
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "gtest/gtest.h"
#include "paddle/fluid/framework/type_defs.h"
#include "paddle/fluid/platform/profiler/dump/deserialization_reader.h"
#include "paddle/fluid/platform/profiler/dump/serialization_logger.h"
#include "paddle/fluid/platform/profiler/event_node.h"
#include "paddle/fluid/platform/profiler/event_python.h"
using paddle::framework::AttributeMap;
using paddle::platform::DeserializationReader;
using paddle::platform::DeviceTraceEvent;
using paddle::platform::HostTraceEvent;
using paddle::platform::HostTraceEventNode;
using paddle::platform::KernelEventInfo;
using paddle::platform::MemcpyEventInfo;
using paddle::platform::MemsetEventInfo;
using paddle::platform::MemTraceEvent;
using paddle::platform::NodeTrees;
using paddle::platform::OperatorSupplementEvent;
using paddle::platform::RuntimeTraceEvent;
using paddle::platform::SerializationLogger;
using phi::TracerEventType;
using phi::TracerMemEventType;
TEST(SerializationLoggerTest, dump_case0) {
std::list<HostTraceEvent> host_events;
std::list<RuntimeTraceEvent> runtime_events;
std::list<DeviceTraceEvent> device_events;
std::list<MemTraceEvent> mem_events;
std::list<OperatorSupplementEvent> op_supplement_events;
host_events.emplace_back(std::string("dataloader#1"),
TracerEventType::Dataloader,
1000,
10000,
10,
10);
host_events.emplace_back(
std::string("op1"), TracerEventType::Operator, 11000, 20000, 10, 10);
host_events.emplace_back(
std::string("op2"), TracerEventType::Operator, 21000, 30000, 10, 10);
host_events.emplace_back(
std::string("op3"), TracerEventType::Operator, 31000, 40000, 10, 11);
mem_events.emplace_back(11500,
0x1000,
TracerMemEventType::Allocate,
10,
10,
50,
"GPU:0",
50,
50,
100,
100);
mem_events.emplace_back(11900,
0x1000,
TracerMemEventType::Free,
10,
10,
-50,
"GPU:0",
0,
50,
100,
100);
std::map<std::string, std::vector<std::vector<int64_t>>> input_shapes;
std::map<std::string, std::vector<std::string>> dtypes;
input_shapes[std::string("X")].push_back(std::vector<int64_t>{1, 2, 3});
input_shapes[std::string("X")].push_back(std::vector<int64_t>{4, 5, 6, 7});
dtypes[std::string("X")].emplace_back("int8");
dtypes[std::string("X")].emplace_back("float32");
AttributeMap attrs;
op_supplement_events.emplace_back(
11600, "op1", input_shapes, dtypes, "op1()", attrs, 0, 10, 10);
runtime_events.emplace_back(
std::string("cudalaunch1"), 15000, 17000, 10, 10, 1, 0);
runtime_events.emplace_back(
std::string("cudalaunch2"), 25000, 35000, 10, 10, 2, 0);
runtime_events.emplace_back(
std::string("cudalaunch3"), 33000, 37000, 10, 11, 3, 0);
runtime_events.emplace_back(
std::string("cudaMemcpy1"), 18000, 19000, 10, 10, 4, 0);
runtime_events.emplace_back(
std::string("cudaMemset1"), 38000, 39000, 10, 11, 5, 0);
device_events.emplace_back(std::string("kernel1"),
TracerEventType::Kernel,
40000,
55000,
0,
10,
10,
1,
KernelEventInfo());
device_events.emplace_back(std::string("kernel2"),
TracerEventType::Kernel,
70000,
95000,
0,
10,
10,
2,
KernelEventInfo());
device_events.emplace_back(std::string("kernel3"),
TracerEventType::Kernel,
60000,
65000,
0,
10,
11,
3,
KernelEventInfo());
device_events.emplace_back(std::string("memcpy1"),
TracerEventType::Memcpy,
56000,
59000,
0,
10,
10,
4,
MemcpyEventInfo());
device_events.emplace_back(std::string("memset1"),
TracerEventType::Memset,
66000,
69000,
0,
10,
11,
5,
MemsetEventInfo());
SerializationLogger logger("test_serialization_logger_case0.pb");
logger.LogMetaInfo(std::string("1.0.2"), 0);
NodeTrees tree(host_events,
runtime_events,
device_events,
mem_events,
op_supplement_events);
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree.Traverse(true);
EXPECT_EQ(nodes[10].size(), 4u);
EXPECT_EQ(nodes[11].size(), 2u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetChildren().size(), 3u);
}
if (thread1_node->Name() == "op1") {
EXPECT_EQ(thread1_node->GetChildren().size(), 0u);
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 2u);
EXPECT_EQ(thread1_node->GetMemTraceEventNodes().size(), 2u);
EXPECT_NE(thread1_node->GetOperatorSupplementEventNode(), nullptr);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "op3") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 2u);
}
}
tree.LogMe(&logger);
logger.LogExtraInfo(std::unordered_map<std::string, std::string>());
}
TEST(SerializationLoggerTest, dump_case1) {
std::list<HostTraceEvent> host_events;
std::list<RuntimeTraceEvent> runtime_events;
std::list<DeviceTraceEvent> device_events;
std::list<MemTraceEvent> mem_events;
std::list<OperatorSupplementEvent> op_supplement_events;
runtime_events.emplace_back(
std::string("cudalaunch1"), 15000, 17000, 10, 10, 1, 0);
runtime_events.emplace_back(
std::string("cudalaunch2"), 25000, 35000, 10, 10, 2, 0);
runtime_events.emplace_back(
std::string("cudalaunch3"), 33000, 37000, 10, 11, 3, 0);
runtime_events.emplace_back(
std::string("cudaMemcpy1"), 18000, 19000, 10, 10, 4, 0);
runtime_events.emplace_back(
std::string("cudaMemset1"), 38000, 39000, 10, 11, 5, 0);
device_events.emplace_back(std::string("kernel1"),
TracerEventType::Kernel,
40000,
55000,
0,
10,
10,
1,
KernelEventInfo());
device_events.emplace_back(std::string("kernel2"),
TracerEventType::Kernel,
70000,
95000,
0,
10,
10,
2,
KernelEventInfo());
device_events.emplace_back(std::string("kernel3"),
TracerEventType::Kernel,
60000,
65000,
0,
10,
11,
3,
KernelEventInfo());
device_events.emplace_back(std::string("memcpy1"),
TracerEventType::Memcpy,
56000,
59000,
0,
10,
10,
4,
MemcpyEventInfo());
device_events.emplace_back(std::string("memset1"),
TracerEventType::Memset,
66000,
69000,
0,
10,
11,
5,
MemsetEventInfo());
SerializationLogger logger("test_serialization_logger_case1.pb");
logger.LogMetaInfo(std::string("1.0.2"), 0);
NodeTrees tree(host_events,
runtime_events,
device_events,
mem_events,
op_supplement_events);
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree.Traverse(true);
EXPECT_EQ(nodes[10].size(), 1u);
EXPECT_EQ(nodes[11].size(), 1u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 3u);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "root node") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 2u);
}
}
tree.LogMe(&logger);
logger.LogExtraInfo(std::unordered_map<std::string, std::string>());
}
TEST(DeserializationReaderTest, restore_case0) {
DeserializationReader reader("test_serialization_logger_case0.pb");
auto profiler_result = reader.Parse();
auto tree = profiler_result->GetNodeTrees();
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree->Traverse(true);
EXPECT_EQ(nodes[10].size(), 4u);
EXPECT_EQ(nodes[11].size(), 2u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetChildren().size(), 3u);
}
if (thread1_node->Name() == "op1") {
EXPECT_EQ(thread1_node->GetChildren().size(), 0u);
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 2u);
EXPECT_EQ(thread1_node->GetMemTraceEventNodes().size(), 2u);
EXPECT_NE(thread1_node->GetOperatorSupplementEventNode(), nullptr);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "op3") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 2u);
}
}
}
TEST(DeserializationReaderTest, restore_case1) {
DeserializationReader reader("test_serialization_logger_case1.pb");
auto profiler_result = reader.Parse();
auto tree = profiler_result->GetNodeTrees();
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree->Traverse(true);
EXPECT_EQ(nodes[10].size(), 1u);
EXPECT_EQ(nodes[11].size(), 1u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 3u);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "root node") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 2u);
}
}
}
@@ -0,0 +1,145 @@
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <set>
#include <string>
#include "glog/logging.h"
#include "gtest/gtest.h"
#ifdef PADDLE_WITH_CUDA
#include <cuda.h>
#endif
#ifdef PADDLE_WITH_HIP
#include <hip/hip_runtime.h>
#endif
#include "paddle/fluid/platform/profiler/event_python.h"
#include "paddle/fluid/platform/profiler/profiler.h"
#include "paddle/phi/common/place.h"
#include "paddle/phi/core/platform/profiler.h"
#include "paddle/phi/core/platform/profiler/event_tracing.h"
TEST(ProfilerTest, TestHostTracer) {
using paddle::platform::Profiler;
using paddle::platform::ProfilerOptions;
using paddle::platform::ProfilerResult;
using paddle::platform::RecordInstantEvent;
using phi::TracerEventType;
ProfilerOptions options;
options.trace_level = 2;
options.trace_switch = 3;
auto profiler = Profiler::Create(options);
EXPECT_TRUE(profiler);
profiler->Prepare();
profiler->Start();
{
RecordInstantEvent(
"TestTraceLevel_record1", TracerEventType::UserDefined, 2);
RecordInstantEvent(
"TestTraceLevel_record2", TracerEventType::UserDefined, 3);
}
auto profiler_result = profiler->Stop();
auto nodetree = profiler_result->GetNodeTrees();
std::set<std::string> host_events;
for (const auto& pair : nodetree->Traverse(true)) {
for (const auto evt : pair.second) {
host_events.insert(evt->Name());
}
}
EXPECT_EQ(host_events.count("TestTraceLevel_record1"), 1u);
EXPECT_EQ(host_events.count("TestTraceLevel_record2"), 0u);
}
TEST(ProfilerTest, TestCudaTracer) {
using paddle::platform::Profiler;
using paddle::platform::ProfilerOptions;
using paddle::platform::ProfilerResult;
ProfilerOptions options;
options.trace_level = 0;
options.trace_switch = 3;
auto profiler = Profiler::Create(options);
EXPECT_TRUE(profiler);
profiler->Prepare();
profiler->Start();
#ifdef PADDLE_WITH_CUDA
cudaStream_t stream;
cudaStreamCreate(&stream);
cudaStreamSynchronize(stream);
#endif
#ifdef PADDLE_WITH_HIP
hipStream_t stream;
hipStreamCreate(&stream);
hipStreamSynchronize(stream);
#endif
auto profiler_result = profiler->Stop();
auto nodetree = profiler_result->GetNodeTrees();
std::vector<std::string> runtime_events;
for (const auto& pair : nodetree->Traverse(true)) {
for (const auto host_node : pair.second) {
for (auto runtime_node : host_node->GetRuntimeTraceEventNodes()) {
runtime_events.push_back(runtime_node->Name());
}
}
}
#ifdef PADDLE_WITH_CUPTI
#ifndef PADDLE_WITH_XPU
EXPECT_GT(runtime_events.size(), 0u);
#endif
#endif
}
TEST(ProfilerTest, TestHostTracerForMem) {
using paddle::platform::EnableHostEventRecorder;
using paddle::platform::MemTraceEventNode;
using paddle::platform::Profiler;
using paddle::platform::ProfilerOptions;
using paddle::platform::ProfilerResult;
using paddle::platform::RecordInstantEvent;
using paddle::platform::RecordMemEvent;
using phi::CPUPlace;
using phi::RecordEvent;
using phi::TracerEventType;
using phi::TracerMemEventType;
ProfilerOptions options;
options.trace_level = 1;
options.trace_switch = 3;
auto profiler = Profiler::Create(options);
EXPECT_TRUE(profiler);
EnableHostEventRecorder();
profiler->Prepare();
profiler->Start();
{
RecordEvent event1(
"TestTracerForMem_phase1", TracerEventType::UserDefined, 1);
RecordMemEvent(reinterpret_cast<void*>(0),
CPUPlace(),
1024,
TracerMemEventType::Allocate);
RecordMemEvent(
reinterpret_cast<void*>(0), CPUPlace(), 1024, TracerMemEventType::Free);
}
{
RecordEvent event2(
"TestTracerForMem_phase2", TracerEventType::UserDefined, 1);
RecordMemEvent(reinterpret_cast<void*>(1024),
CPUPlace(),
1024,
TracerMemEventType::Allocate);
RecordMemEvent(reinterpret_cast<void*>(1024),
CPUPlace(),
1024,
TracerMemEventType::Free);
}
auto profiler_result = profiler->Stop();
auto nodetree = profiler_result->GetNodeTrees();
}
@@ -0,0 +1,390 @@
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "gtest/gtest.h"
#include "paddle/fluid/framework/type_defs.h"
#include "paddle/fluid/platform/profiler/chrometracing_logger.h"
#include "paddle/fluid/platform/profiler/event_node.h"
using paddle::framework::AttributeMap;
using paddle::platform::ChromeTracingLogger;
using paddle::platform::CudaRuntimeTraceEventNode;
using paddle::platform::DeviceTraceEvent;
using paddle::platform::DeviceTraceEventNode;
using paddle::platform::HostTraceEvent;
using paddle::platform::HostTraceEventNode;
using paddle::platform::KernelEventInfo;
using paddle::platform::MemcpyEventInfo;
using paddle::platform::MemsetEventInfo;
using paddle::platform::MemTraceEvent;
using paddle::platform::MemTraceEventNode;
using paddle::platform::NodeTrees;
using paddle::platform::OperatorSupplementEvent;
using paddle::platform::OperatorSupplementEventNode;
using paddle::platform::RuntimeTraceEvent;
using phi::TracerEventType;
using phi::TracerMemEventType;
TEST(NodeTreesTest, LogMe_case0) {
std::list<HostTraceEvent> host_events;
std::list<RuntimeTraceEvent> runtime_events;
std::list<DeviceTraceEvent> device_events;
std::list<MemTraceEvent> mem_events;
std::list<OperatorSupplementEvent> op_supplement_events;
host_events.emplace_back(std::string("dataloader#1"),
TracerEventType::Dataloader,
1000,
10000,
10,
10);
host_events.emplace_back(
std::string("op1"), TracerEventType::Operator, 11000, 20000, 10, 10);
host_events.emplace_back(
std::string("op2"), TracerEventType::Operator, 21000, 30000, 10, 10);
host_events.emplace_back(
std::string("op3"), TracerEventType::Operator, 31000, 40000, 10, 11);
mem_events.emplace_back(11500,
0x1000,
TracerMemEventType::Allocate,
10,
10,
50,
"GPU:0",
50,
50,
100,
100);
mem_events.emplace_back(11900,
0x1000,
TracerMemEventType::Free,
10,
10,
-50,
"GPU:0",
0,
50,
100,
100);
std::map<std::string, std::vector<std::vector<int64_t>>> input_shapes;
std::map<std::string, std::vector<std::string>> dtypes;
input_shapes[std::string("X")].push_back(std::vector<int64_t>{1, 2, 3});
input_shapes[std::string("X")].push_back(std::vector<int64_t>{4, 5, 6, 7});
dtypes[std::string("X")].emplace_back("int8");
dtypes[std::string("X")].emplace_back("float32");
AttributeMap attrs;
op_supplement_events.emplace_back(
11600, "op1", input_shapes, dtypes, "op1()", attrs, 0, 10, 10);
runtime_events.emplace_back(
std::string("cudalaunch1"), 15000, 17000, 10, 10, 1, 0);
runtime_events.emplace_back(
std::string("cudalaunch2"), 25000, 35000, 10, 10, 2, 0);
runtime_events.emplace_back(
std::string("cudalaunch3"), 33000, 37000, 10, 11, 3, 0);
runtime_events.emplace_back(
std::string("cudaMemcpy1"), 18000, 19000, 10, 10, 4, 0);
runtime_events.emplace_back(
std::string("cudaMemset1"), 38000, 39000, 10, 11, 5, 0);
device_events.emplace_back(std::string("kernel1"),
TracerEventType::Kernel,
40000,
55000,
0,
10,
10,
1,
KernelEventInfo());
device_events.emplace_back(std::string("kernel2"),
TracerEventType::Kernel,
70000,
95000,
0,
10,
10,
2,
KernelEventInfo());
device_events.emplace_back(std::string("kernel3"),
TracerEventType::Kernel,
60000,
65000,
0,
10,
11,
3,
KernelEventInfo());
device_events.emplace_back(std::string("memcpy1"),
TracerEventType::Memcpy,
56000,
59000,
0,
10,
10,
4,
MemcpyEventInfo());
device_events.emplace_back(std::string("memset1"),
TracerEventType::Memset,
66000,
69000,
0,
10,
11,
5,
MemsetEventInfo());
ChromeTracingLogger logger("test_nodetrees_logme_case0.json");
logger.LogMetaInfo(std::string("1.0.2"), 0);
NodeTrees tree(host_events,
runtime_events,
device_events,
mem_events,
op_supplement_events);
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree.Traverse(true);
EXPECT_EQ(nodes[10].size(), 4u);
EXPECT_EQ(nodes[11].size(), 2u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetChildren().size(), 3u);
}
if (thread1_node->Name() == "op1") {
EXPECT_EQ(thread1_node->GetChildren().size(), 0u);
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 2u);
EXPECT_EQ(thread1_node->GetMemTraceEventNodes().size(), 2u);
EXPECT_NE(thread1_node->GetOperatorSupplementEventNode(), nullptr);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "op3") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 2u);
}
}
tree.LogMe(&logger);
logger.LogExtraInfo(std::unordered_map<std::string, std::string>());
}
TEST(NodeTreesTest, LogMe_case1) {
std::list<HostTraceEvent> host_events;
std::list<RuntimeTraceEvent> runtime_events;
std::list<DeviceTraceEvent> device_events;
std::list<MemTraceEvent> mem_events;
std::list<OperatorSupplementEvent> op_supplement_events;
runtime_events.emplace_back(
std::string("cudalaunch1"), 15000, 17000, 10, 10, 1, 0);
runtime_events.emplace_back(
std::string("cudalaunch2"), 25000, 35000, 10, 10, 2, 0);
runtime_events.emplace_back(
std::string("cudalaunch3"), 33000, 37000, 10, 11, 3, 0);
runtime_events.emplace_back(
std::string("cudaMemcpy1"), 18000, 19000, 10, 10, 4, 0);
runtime_events.emplace_back(
std::string("cudaMemset1"), 38000, 39000, 10, 11, 5, 0);
device_events.emplace_back(std::string("kernel1"),
TracerEventType::Kernel,
40000,
55000,
0,
10,
10,
1,
KernelEventInfo());
device_events.emplace_back(std::string("kernel2"),
TracerEventType::Kernel,
70000,
95000,
0,
10,
10,
2,
KernelEventInfo());
device_events.emplace_back(std::string("kernel3"),
TracerEventType::Kernel,
60000,
65000,
0,
10,
11,
3,
KernelEventInfo());
device_events.emplace_back(std::string("memcpy1"),
TracerEventType::Memcpy,
56000,
59000,
0,
10,
10,
4,
MemcpyEventInfo());
device_events.emplace_back(std::string("memset1"),
TracerEventType::Memset,
66000,
69000,
0,
10,
11,
5,
MemsetEventInfo());
ChromeTracingLogger logger("test_nodetrees_logme_case1.json");
logger.LogMetaInfo(std::string("1.0.2"), 0);
NodeTrees tree(host_events,
runtime_events,
device_events,
mem_events,
op_supplement_events);
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree.Traverse(true);
EXPECT_EQ(nodes[10].size(), 1u);
EXPECT_EQ(nodes[11].size(), 1u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 3u);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "root node") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 2u);
}
}
tree.LogMe(&logger);
logger.LogExtraInfo(std::unordered_map<std::string, std::string>());
}
TEST(NodeTreesTest, HandleTrees_case0) {
std::list<HostTraceEvent> host_events;
std::list<RuntimeTraceEvent> runtime_events;
std::list<DeviceTraceEvent> device_events;
std::list<MemTraceEvent> mem_events;
std::list<OperatorSupplementEvent> op_supplement_events;
host_events.emplace_back(
std::string("op1"), TracerEventType::Operator, 10000, 100000, 10, 10);
host_events.emplace_back(
std::string("op2"), TracerEventType::Operator, 30000, 70000, 10, 10);
host_events.emplace_back(
std::string("op3"), TracerEventType::Operator, 2000, 120000, 10, 11);
mem_events.emplace_back(11500,
0x1000,
TracerMemEventType::Allocate,
10,
10,
50,
"GPU:0",
50,
50,
100,
100);
mem_events.emplace_back(11900,
0x1000,
TracerMemEventType::Free,
10,
10,
-50,
"GPU:0",
0,
50,
100,
100);
AttributeMap attrs;
op_supplement_events.emplace_back(
11600,
"op1",
std::map<std::string, std::vector<std::vector<int64_t>>>(),
std::map<std::string, std::vector<std::string>>(),
"op1()",
attrs,
0,
10,
10);
runtime_events.emplace_back(
std::string("cudalaunch1"), 15000, 25000, 10, 10, 1, 0);
runtime_events.emplace_back(
std::string("cudalaunch2"), 35000, 45000, 10, 10, 2, 0);
runtime_events.emplace_back(
std::string("cudalaunch3"), 10000, 55000, 10, 11, 3, 0);
device_events.emplace_back(std::string("kernel1"),
TracerEventType::Kernel,
40000,
55000,
0,
10,
10,
1,
KernelEventInfo());
device_events.emplace_back(std::string("kernel2"),
TracerEventType::Kernel,
70000,
95000,
0,
10,
10,
2,
KernelEventInfo());
device_events.emplace_back(std::string("kernel3"),
TracerEventType::Kernel,
60000,
75000,
0,
10,
11,
3,
KernelEventInfo());
ChromeTracingLogger logger("test_nodetrees_handletrees_case0.json");
logger.LogMetaInfo(std::string("1.0.2"), 0);
NodeTrees tree(host_events,
runtime_events,
device_events,
mem_events,
op_supplement_events);
std::map<uint64_t, std::vector<HostTraceEventNode*>> nodes =
tree.Traverse(true);
EXPECT_EQ(nodes[10].size(), 3u);
EXPECT_EQ(nodes[11].size(), 2u);
std::vector<HostTraceEventNode*> thread1_nodes = nodes[10];
std::vector<HostTraceEventNode*> thread2_nodes = nodes[11];
for (auto& thread1_node : thread1_nodes) {
if (thread1_node->Name() == "root node") {
EXPECT_EQ(thread1_node->GetChildren().size(), 1u);
}
if (thread1_node->Name() == "op1") {
EXPECT_EQ(thread1_node->GetChildren().size(), 1u);
EXPECT_EQ(thread1_node->GetRuntimeTraceEventNodes().size(), 1u);
}
}
for (auto& thread2_node : thread2_nodes) {
if (thread2_node->Name() == "op3") {
EXPECT_EQ(thread2_node->GetChildren().size(), 0u);
EXPECT_EQ(thread2_node->GetRuntimeTraceEventNodes().size(), 1u);
}
}
std::function<void(HostTraceEventNode*)> host_event_node_handle(
[&](HostTraceEventNode* a) { logger.LogHostTraceEventNode(*a); });
std::function<void(CudaRuntimeTraceEventNode*)> runtime_event_node_handle(
[&](CudaRuntimeTraceEventNode* a) {
logger.LogRuntimeTraceEventNode(*a);
});
std::function<void(DeviceTraceEventNode*)> device_event_node_handle(
[&](DeviceTraceEventNode* a) { logger.LogDeviceTraceEventNode(*a); });
std::function<void(MemTraceEventNode*)> mem_event_node_handle(
[&](MemTraceEventNode* a) { logger.LogMemTraceEventNode(*a); });
std::function<void(OperatorSupplementEventNode*)>
op_supplement_event_node_handle([&](OperatorSupplementEventNode* a) {});
tree.HandleTrees(host_event_node_handle,
runtime_event_node_handle,
device_event_node_handle,
mem_event_node_handle,
op_supplement_event_node_handle);
logger.LogExtraInfo(std::unordered_map<std::string, std::string>());
}
@@ -0,0 +1,31 @@
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "gtest/gtest.h"
#include "paddle/phi/core/platform/profiler/extra_info.h"
using paddle::platform::ExtraInfo;
TEST(ExtraInfoTest, case0) {
ExtraInfo instance;
instance.AddExtraInfo(std::string("info1"), std::string("%d"), 20);
instance.AddExtraInfo(std::string("info2"), std::string("%s"), "helloworld");
std::unordered_map<std::string, std::string> map = instance.GetExtraInfo();
EXPECT_EQ(map["info1"], "20");
EXPECT_EQ(map["info2"], "helloworld");
EXPECT_EQ(map.size(), 2u);
instance.Clear();
map = instance.GetExtraInfo();
EXPECT_EQ(map.size(), 0u);
}