Skip to content

Commit 7db6e97

Browse files
space-time-stack: allow demangled names
1 parent 6dae155 commit 7db6e97

File tree

7 files changed

+75
-81
lines changed

7 files changed

+75
-81
lines changed

CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/profiling/all)
116116
set(COMMON_HEADERS_PATH ${CMAKE_CURRENT_BINARY_DIR}/common)
117117
include_directories(${COMMON_HEADERS_PATH})
118118

119+
# Allow all tools to include any file.
120+
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
121+
119122
set(SINGLELIB_PROFILERS "" CACHE STRING "" FORCE)
120123

121124
# Export settings

common/utils/demangle.hpp

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef KOKKOSTOOLS_COMMON_UTILS_DEMANGLE_HPP
2+
#define KOKKOSTOOLS_COMMON_UTILS_DEMANGLE_HPP
3+
4+
#include <memory>
5+
#include <string>
6+
7+
#if defined(__GXX_ABI_VERSION)
8+
#define HAVE_GCC_ABI_DEMANGLE
9+
#endif
10+
11+
#if defined(HAVE_GCC_ABI_DEMANGLE)
12+
#include <cxxabi.h>
13+
#endif // HAVE_GCC_ABI_DEMANGLE
14+
15+
namespace KokkosTools
16+
{
17+
18+
//! Demangme @p mangled_name.
19+
inline std::string demangleName(const std::string& mangled_name)
20+
{
21+
#if defined(HAVE_GCC_ABI_DEMANGLE)
22+
int status = 0;
23+
24+
std::unique_ptr<char, decltype(&std::free)> demangled_name(
25+
abi::__cxa_demangle(mangled_name.c_str(), nullptr, nullptr, &status),
26+
&std::free
27+
);
28+
29+
if(status == 0) return std::string(demangled_name.get());
30+
else demangled_name.reset();
31+
#endif
32+
return mangled_name;
33+
}
34+
35+
} // namespace KokkosTools
36+
37+
#endif // KOKKOSTOOLS_COMMON_UTILS_DEMANGLE_HPP

profiling/simple-kernel-timer/kp_json_writer.cpp

+2-16
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,6 @@ inline void write_json(std::ostream& os, KernelPerformanceInfo const& kp,
5757
}
5858
// clang-format off
5959

60-
int find_index(std::vector<KernelPerformanceInfo*>& kernels,
61-
const char* kernelName) {
62-
63-
for(unsigned int i = 0; i < kernels.size(); i++) {
64-
KernelPerformanceInfo* nextKernel = kernels[i];
65-
66-
if(strcmp(nextKernel->getName(), kernelName) == 0) {
67-
return i;
68-
}
69-
}
70-
71-
return -1;
72-
}
73-
7460
int main(int argc, char* argv[]) {
7561

7662
if(argc == 1) {
@@ -100,8 +86,8 @@ int main(int argc, char* argv[]) {
10086
while(! feof(the_file)) {
10187
KernelPerformanceInfo* new_kernel = new KernelPerformanceInfo("", PARALLEL_FOR);
10288
if(new_kernel->readFromFile(the_file)) {
103-
if(strlen(new_kernel->getName()) > 0) {
104-
int kernelIndex = find_index(kernelInfo, new_kernel->getName());
89+
if( ! new_kernel->getName().empty()) {
90+
int kernelIndex = find_index(kernelInfo, new_kernel->getName().c_str());
10591

10692
if(kernelIndex > -1) {
10793
kernelInfo[kernelIndex]->addTime(new_kernel->getTime());

profiling/simple-kernel-timer/kp_kernel_info.h

+12-45
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,10 @@
2222
#include <string>
2323
#include <cstring>
2424

25-
#if defined(__GXX_ABI_VERSION)
26-
#define HAVE_GCC_ABI_DEMANGLE
27-
#endif
28-
29-
#if defined(HAVE_GCC_ABI_DEMANGLE)
30-
#include <cxxabi.h>
31-
#endif // HAVE_GCC_ABI_DEMANGLE
25+
#include "common/utils/demangle.hpp"
3226

3327
namespace KokkosTools::KernelTimer {
3428

35-
inline char* demangleName(char* kernelName) {
36-
#if defined(HAVE_GCC_ABI_DEMANGLE)
37-
int status = -1;
38-
char* demangledKernelName =
39-
abi::__cxa_demangle(kernelName, NULL, NULL, &status);
40-
if (status == 0) {
41-
free(kernelName);
42-
kernelName = demangledKernelName;
43-
}
44-
#endif // HAVE_GCC_ABI_DEMANGLE
45-
return kernelName;
46-
}
47-
4829
inline double seconds() {
4930
struct timeval now;
5031
gettimeofday(&now, NULL);
@@ -62,15 +43,7 @@ enum KernelExecutionType {
6243
class KernelPerformanceInfo {
6344
public:
6445
KernelPerformanceInfo(std::string kName, KernelExecutionType kernelType)
65-
: kType(kernelType) {
66-
kernelName = (char*)malloc(sizeof(char) * (kName.size() + 1));
67-
strcpy(kernelName, kName.c_str());
68-
69-
callCount = 0;
70-
time = 0;
71-
}
72-
73-
~KernelPerformanceInfo() { free(kernelName); }
46+
: kernelName(std::move(kName)), kType(kernelType) {}
7447

7548
KernelExecutionType getKernelType() const { return kType; }
7649

@@ -95,7 +68,7 @@ class KernelPerformanceInfo {
9568

9669
double getTimeSq() { return timeSq; }
9770

98-
char* getName() const { return kernelName; }
71+
const std::string& getName() const { return kernelName; }
9972

10073
void addCallCount(const uint64_t newCalls) { callCount += newCalls; }
10174

@@ -112,13 +85,7 @@ class KernelPerformanceInfo {
11285
copy((char*)&kernelNameLength, &entry[nextIndex], sizeof(kernelNameLength));
11386
nextIndex += sizeof(kernelNameLength);
11487

115-
if (strlen(kernelName) > 0) {
116-
free(kernelName);
117-
}
118-
119-
kernelName = (char*)malloc(sizeof(char) * (kernelNameLength + 1));
120-
copy(kernelName, &entry[nextIndex], kernelNameLength);
121-
kernelName[kernelNameLength] = '\0';
88+
this->kernelName = std::string(&entry[nextIndex], kernelNameLength);
12289

12390
kernelName = demangleName(kernelName);
12491

@@ -152,7 +119,7 @@ class KernelPerformanceInfo {
152119
}
153120

154121
void writeToBinaryFile(FILE* output) {
155-
const uint32_t kernelNameLen = (uint32_t)strlen(kernelName);
122+
const uint32_t kernelNameLen = kernelName.size();
156123
const uint32_t recordLen = sizeof(uint32_t) + sizeof(char) * kernelNameLen +
157124
sizeof(uint64_t) + sizeof(double) +
158125
sizeof(double) + sizeof(uint32_t);
@@ -163,7 +130,7 @@ class KernelPerformanceInfo {
163130
copy(&entry[nextIndex], (char*)&kernelNameLen, sizeof(kernelNameLen));
164131
nextIndex += sizeof(kernelNameLen);
165132

166-
copy(&entry[nextIndex], kernelName, kernelNameLen);
133+
copy(&entry[nextIndex], kernelName.c_str(), kernelNameLen);
167134
nextIndex += kernelNameLen;
168135

169136
copy(&entry[nextIndex], (char*)&callCount, sizeof(callCount));
@@ -191,7 +158,7 @@ class KernelPerformanceInfo {
191158
snprintf(indentBuffer, 256, "%s ", indent);
192159

193160
fprintf(output, "%s\"kernel-name\" : \"%s\",\n", indentBuffer,
194-
kernelName);
161+
kernelName.c_str());
195162
// fprintf(output, "%s\"region\" : \"%s\",\n", indentBuffer,
196163
// regionName);
197164
fprintf(output, "%s\"call-count\" : %llu,\n", indentBuffer,
@@ -216,12 +183,12 @@ class KernelPerformanceInfo {
216183
}
217184
}
218185

219-
char* kernelName;
186+
std::string kernelName;
220187
// const char* regionName;
221-
uint64_t callCount;
222-
double time;
223-
double timeSq;
224-
double startTime;
188+
uint64_t callCount = 0;
189+
double time = 0;
190+
double timeSq = 0;
191+
double startTime = 0;
225192
KernelExecutionType kType;
226193
};
227194

profiling/simple-kernel-timer/kp_reader.cpp

+7-19
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,6 @@
2525

2626
using namespace KokkosTools::KernelTimer;
2727

28-
int find_index(std::vector<KernelPerformanceInfo*>& kernels,
29-
const char* kernelName) {
30-
for (unsigned int i = 0; i < kernels.size(); i++) {
31-
KernelPerformanceInfo* nextKernel = kernels[i];
32-
33-
if (strcmp(nextKernel->getName(), kernelName) == 0) {
34-
return i;
35-
}
36-
}
37-
38-
return -1;
39-
}
40-
4128
int main(int argc, char* argv[]) {
4229
if (argc == 1) {
4330
fprintf(stderr, "Did you specify any data files on the command line!\n");
@@ -77,8 +64,9 @@ int main(int argc, char* argv[]) {
7764
KernelPerformanceInfo* new_kernel =
7865
new KernelPerformanceInfo("", PARALLEL_FOR);
7966
if (new_kernel->readFromFile(the_file)) {
80-
if (strlen(new_kernel->getName()) > 0) {
81-
int kernelIndex = find_index(kernelInfo, new_kernel->getName());
67+
if (!new_kernel->getName().empty()) {
68+
int kernelIndex =
69+
find_index(kernelInfo, new_kernel->getName().c_str());
8270

8371
if (kernelIndex > -1) {
8472
kernelInfo[kernelIndex]->addTime(new_kernel->getTime());
@@ -110,7 +98,7 @@ int main(int argc, char* argv[]) {
11098
if (kernelInfo[i]->getKernelType() != REGION) continue;
11199
if (fixed_width)
112100
printf("- %100s\n%11s%c%15.5f%c%12" PRIu64 "%c%15.5f%c%7.3f%c%7.3f\n",
113-
kernelInfo[i]->getName(),
101+
kernelInfo[i]->getName().c_str(),
114102
(kernelInfo[i]->getKernelType() == PARALLEL_FOR)
115103
? (" (ParFor) ")
116104
: ((kernelInfo[i]->getKernelType() == PARALLEL_REDUCE)
@@ -125,7 +113,7 @@ int main(int argc, char* argv[]) {
125113
(kernelInfo[i]->getTime() / totalExecuteTime) * 100.0);
126114
else
127115
printf("- %s\n%s%c%f%c%" PRIu64 "%c%f%c%f%c%f\n",
128-
kernelInfo[i]->getName(),
116+
kernelInfo[i]->getName().c_str(),
129117
(kernelInfo[i]->getKernelType() == PARALLEL_FOR)
130118
? (" (ParFor) ")
131119
: ((kernelInfo[i]->getKernelType() == PARALLEL_REDUCE)
@@ -152,7 +140,7 @@ int main(int argc, char* argv[]) {
152140
if (kernelInfo[i]->getKernelType() == REGION) continue;
153141
if (fixed_width)
154142
printf("- %100s\n%11s%c%15.5f%c%12" PRIu64 "%c%15.5f%c%7.3f%c%7.3f\n",
155-
kernelInfo[i]->getName(),
143+
kernelInfo[i]->getName().c_str(),
156144
(kernelInfo[i]->getKernelType() == PARALLEL_FOR)
157145
? (" (ParFor) ")
158146
: ((kernelInfo[i]->getKernelType() == PARALLEL_REDUCE)
@@ -167,7 +155,7 @@ int main(int argc, char* argv[]) {
167155
(kernelInfo[i]->getTime() / totalExecuteTime) * 100.0);
168156
else
169157
printf("- %s\n%s%c%f%c%" PRIu64 "%c%f%c%f%c%f\n",
170-
kernelInfo[i]->getName(),
158+
kernelInfo[i]->getName().c_str(),
171159
(kernelInfo[i]->getKernelType() == PARALLEL_FOR)
172160
? (" (ParFor) ")
173161
: ((kernelInfo[i]->getKernelType() == PARALLEL_REDUCE)

profiling/simple-kernel-timer/kp_shared.h

+11
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
#ifndef _H_KOKKOSP_KERNEL_SHARED
1818
#define _H_KOKKOSP_KERNEL_SHARED
1919

20+
#include <algorithm>
2021
#include <map>
2122
#include <memory>
23+
#include <vector>
24+
2225
#include "kp_kernel_info.h"
2326

2427
namespace KokkosTools::KernelTimer {
@@ -39,6 +42,14 @@ inline bool compareKernelPerformanceInfo(KernelPerformanceInfo* left,
3942
return left->getTime() > right->getTime();
4043
};
4144

45+
inline int find_index(std::vector<KernelPerformanceInfo*>& kernels,
46+
const char* kernelName) {
47+
const auto it = std::find_if(
48+
kernels.begin(), kernels.end(),
49+
[&](const auto& kernel) { return kernel->getName() == kernelName; });
50+
return it == kernels.cend() ? -1 : std::distance(kernels.begin(), it);
51+
}
52+
4253
} // namespace KokkosTools::KernelTimer
4354

4455
#endif // _H_KOKKOSP_KERNEL_SHARED

profiling/space-time-stack/kp_space_time_stack.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include <algorithm>
3232
#include <cstring>
3333

34+
#include "common/utils/demangle.hpp"
35+
3436
#include "kp_core.hpp"
3537

3638
#if USE_MPI
@@ -741,7 +743,7 @@ struct State {
741743
}
742744

743745
void begin_frame(const char* name, StackKind kind) {
744-
std::string name_str(name);
746+
std::string name_str(demangleName(name));
745747
stack_frame = stack_frame->get_child(std::move(name_str), kind);
746748
stack_frame->begin();
747749
}

0 commit comments

Comments
 (0)