Skip to content

Commit b744449

Browse files
valentinandreifacebook-github-bot
authored andcommitted
Configure activity types to be traced
Summary: This allows configuring which activity type will be traced. For example if we are only interested in memory transfers between CPU-GPU, we can specify that from the configuration file. Valid activity names are "gpu_memcpy", "gpu_memset", "concurrent_kernel", "external_correlation", "cuda_runtime". The configuration file key is "ACTIVITY_TYPES". Reviewed By: gdankel Differential Revision: D24157062 fbshipit-source-id: 7f0922ef28884edbca6c9190cc9fb603bf2db7a6
1 parent 0339667 commit b744449

File tree

7 files changed

+199
-16
lines changed

7 files changed

+199
-16
lines changed

libkineto/src/ActivityProfiler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ void ActivityProfiler::configure(
449449
if (VLOG_IS_ON(1)) {
450450
timestamp = high_resolution_clock::now();
451451
}
452-
cupti_.enableCuptiActivities();
452+
cupti_.enableCuptiActivities(config_->selectedActivityTypes());
453453
if (VLOG_IS_ON(1)) {
454454
auto t2 = high_resolution_clock::now();
455455
addOverheadSample(
@@ -477,7 +477,7 @@ void ActivityProfiler::endTrace() {
477477
if (VLOG_IS_ON(1)) {
478478
timestamp = high_resolution_clock::now();
479479
}
480-
cupti_.disableCuptiActivities();
480+
cupti_.disableCuptiActivities(config_->selectedActivityTypes());
481481
if (VLOG_IS_ON(1)) {
482482
auto t2 = high_resolution_clock::now();
483483
addOverheadSample(

libkineto/src/Config.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ const string kMaxEventProfilersPerGpuKey = "MAX_EVENT_PROFILERS_PER_GPU";
5454

5555
// Activity Profiler
5656
const string kActivitiesEnabledKey = "ACTIVITIES_ENABLED";
57+
const string kActivityTypesKey = "ACTIVITY_TYPES";
5758
const string kActivitiesLogFileKey = "ACTIVITIES_LOG_FILE";
5859
const string kActivitiesDurationKey = "ACTIVITIES_DURATION_SECS";
5960
const string kActivitiesDurationMsecsKey = "ACTIVITIES_DURATION_MSECS";
@@ -66,6 +67,13 @@ const string kActivitiesWarmupDurationSecsKey = "ACTIVITIES_WARMUP_PERIOD_SECS";
6667
const string kActivitiesMaxGpuBufferSizeKey =
6768
"ACTIVITIES_MAX_GPU_BUFFER_SIZE_MB";
6869

70+
// Valid configuration file entries for activity types
71+
const string kActivityMemcpy = "gpu_memcpy";
72+
const string kActivityMemset = "gpu_memset";
73+
const string kActivityConcurrentKernel = "concurrent_kernel";
74+
const string kActivityExternalCorrelation = "external_correlation";
75+
const string kActivityRuntime = "cuda_runtime";
76+
6977
const string kDefaultLogFileFmt = "/tmp/libkineto_activities_{}.json";
7078

7179
// Common
@@ -181,6 +189,32 @@ static time_point<system_clock> handleRequestTimestamp(int64_t ms) {
181189
return t;
182190
}
183191

192+
void Config::addActivityTypes(
193+
const std::vector<std::string>& selected_activities) {
194+
if (selected_activities.size() > 0) {
195+
for (const auto& activity : selected_activities) {
196+
if (activity == "") {
197+
continue;
198+
} else if (activity == kActivityMemcpy) {
199+
selectedActivityTypes_.insert(ActivityType::MEMCPY);
200+
} else if (activity == kActivityMemset) {
201+
selectedActivityTypes_.insert(ActivityType::MEMSET);
202+
} else if (activity == kActivityConcurrentKernel) {
203+
selectedActivityTypes_.insert(ActivityType::CONCURRENT_KERNEL);
204+
} else if (activity == kActivityExternalCorrelation) {
205+
selectedActivityTypes_.insert(ActivityType::EXTERNAL_CORRELATION);
206+
} else if (activity == kActivityRuntime) {
207+
selectedActivityTypes_.insert(ActivityType::RUNTIME);
208+
} else {
209+
throw std::invalid_argument(fmt::format(
210+
"Invalid activity type selected: {}",
211+
activity
212+
));
213+
}
214+
}
215+
}
216+
}
217+
184218
bool Config::handleOption(const std::string& name, std::string& val) {
185219
// Event Profiler
186220
if (name == kEventsKey) {
@@ -189,6 +223,9 @@ bool Config::handleOption(const std::string& name, std::string& val) {
189223
} else if (name == kMetricsKey) {
190224
vector<string> metric_names = splitAndTrim(val, ',');
191225
metricNames_.insert(metric_names.begin(), metric_names.end());
226+
} else if (name == kActivityTypesKey) {
227+
vector<string> activity_types = splitAndTrim(toLower(val), ',');
228+
addActivityTypes(activity_types);
192229
} else if (name == kSamplePeriodKey) {
193230
samplePeriod_ = milliseconds(toInt32(val));
194231
} else if (name == kMultiplexPeriodKey) {
@@ -308,6 +345,10 @@ void Config::validate() {
308345
LOG(WARNING) << "Setting samples per report to " << max_samples_per_report;
309346
samplesPerReport_ = max_samples_per_report;
310347
}
348+
349+
if (selectedActivityTypes_.size() == 0) {
350+
selectDefaultActivityTypes();
351+
}
311352
}
312353

313354
void Config::setReportPeriod(milliseconds msecs) {
@@ -340,6 +381,32 @@ void Config::printActivityProfilerConfig(std::ostream& s) const {
340381
<< activitiesOnDemandExternalGpuOpCountThreshold() << std::endl;
341382
s << "Max GPU buffer size: " << activitiesMaxGpuBufferSize() / 1024 / 1024
342383
<< "MB" << std::endl;
384+
385+
s << "Enabled activities: ";
386+
for (const auto& activity : selectedActivityTypes_) {
387+
switch(activity){
388+
case ActivityType::MEMCPY:
389+
s << kActivityMemcpy << " ";
390+
break;
391+
case ActivityType::MEMSET:
392+
s << kActivityMemset << " ";
393+
break;
394+
case ActivityType::CONCURRENT_KERNEL:
395+
s << kActivityConcurrentKernel << " ";
396+
break;
397+
case ActivityType::EXTERNAL_CORRELATION:
398+
s << kActivityExternalCorrelation << " ";
399+
break;
400+
case ActivityType::RUNTIME:
401+
s << kActivityRuntime << " ";
402+
break;
403+
default:
404+
s << "UNKNOWN_ACTIVITY_NAME" << " ";
405+
break;
406+
}
407+
}
408+
s << std::endl;
409+
343410
AbstractConfig::printActivityProfilerConfig(s);
344411
}
345412

libkineto/src/Config.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
#include "AbstractConfig.h"
11+
#include "CuptiActivityType.h"
1112

1213
#include <assert.h>
1314
#include <chrono>
@@ -139,6 +140,11 @@ class Config : public AbstractConfig {
139140
return eventProfilerMaxInstancesPerGpu_;
140141
}
141142

143+
// The types of activities selected in the configuration file
144+
const std::set<ActivityType>& selectedActivityTypes() const {
145+
return selectedActivityTypes_;
146+
}
147+
142148
// Trace for this long
143149
std::chrono::milliseconds activitiesOnDemandDuration() const {
144150
return activitiesOnDemandDuration_;
@@ -257,6 +263,20 @@ class Config : public AbstractConfig {
257263

258264
uint8_t createDeviceMask(const std::string& val);
259265

266+
// Adds valid activity types from the user defined string list in the
267+
// configuration file
268+
void addActivityTypes(const std::vector<std::string>& selected_activities);
269+
270+
// Sets the default activity types to be traced
271+
void selectDefaultActivityTypes() {
272+
// If the user has not specified an activity list, add all types
273+
selectedActivityTypes_.insert(ActivityType::MEMCPY);
274+
selectedActivityTypes_.insert(ActivityType::MEMSET);
275+
selectedActivityTypes_.insert(ActivityType::CONCURRENT_KERNEL);
276+
selectedActivityTypes_.insert(ActivityType::EXTERNAL_CORRELATION);
277+
selectedActivityTypes_.insert(ActivityType::RUNTIME);
278+
}
279+
260280
int verboseLogLevel_;
261281
std::vector<std::string> verboseLogModules_;
262282

@@ -284,6 +304,7 @@ class Config : public AbstractConfig {
284304

285305
// Activity profiler
286306
bool activityProfilerEnabled_;
307+
std::set<ActivityType> selectedActivityTypes_;
287308

288309
// The activity profiler settings are all on-demand
289310
std::string activitiesLogFile_;

libkineto/src/CuptiActivityInterface.cpp

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -195,27 +195,55 @@ void CUPTIAPI CuptiActivityInterface::bufferCompleted(
195195
}
196196
}
197197

198-
void CuptiActivityInterface::enableCuptiActivities() {
198+
void CuptiActivityInterface::enableCuptiActivities(
199+
const std::set<ActivityType>& selected_activities) {
199200
static bool registered = false;
200201
if (!registered) {
201202
CUPTI_CALL(
202203
cuptiActivityRegisterCallbacks(bufferRequested, bufferCompleted));
203204
}
204-
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_MEMCPY));
205-
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_MEMSET));
206-
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL));
207-
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION));
208-
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_RUNTIME));
205+
206+
for (const auto& activity : selected_activities) {
207+
if (activity == ActivityType::MEMCPY) {
208+
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_MEMCPY));
209+
}
210+
if (activity == ActivityType::MEMSET) {
211+
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_MEMSET));
212+
}
213+
if (activity == ActivityType::CONCURRENT_KERNEL) {
214+
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL));
215+
}
216+
if (activity == ActivityType::EXTERNAL_CORRELATION) {
217+
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION));
218+
}
219+
if (activity == ActivityType::RUNTIME) {
220+
CUPTI_CALL(cuptiActivityEnable(CUPTI_ACTIVITY_KIND_RUNTIME));
221+
}
222+
}
223+
209224
// Explicitly enabled, so reset this flag if set
210225
stopCollection = false;
211226
}
212227

213-
void CuptiActivityInterface::disableCuptiActivities() {
214-
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_MEMCPY));
215-
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_MEMSET));
216-
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL));
217-
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION));
218-
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_RUNTIME));
228+
void CuptiActivityInterface::disableCuptiActivities(
229+
const std::set<ActivityType>& selected_activities) {
230+
for (const auto& activity : selected_activities) {
231+
if (activity == ActivityType::MEMCPY) {
232+
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_MEMCPY));
233+
}
234+
if (activity == ActivityType::MEMSET) {
235+
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_MEMSET));
236+
}
237+
if (activity == ActivityType::CONCURRENT_KERNEL) {
238+
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_CONCURRENT_KERNEL));
239+
}
240+
if (activity == ActivityType::EXTERNAL_CORRELATION) {
241+
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_EXTERNAL_CORRELATION));
242+
}
243+
if (activity == ActivityType::RUNTIME) {
244+
CUPTI_CALL(cuptiActivityDisable(CUPTI_ACTIVITY_KIND_RUNTIME));
245+
}
246+
}
219247
}
220248

221249
} // namespace KINETO_NAMESPACE

libkineto/src/CuptiActivityInterface.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77

88
#pragma once
99

10+
#include "CuptiActivityType.h"
11+
1012
#include <atomic>
1113
#include <cupti.h>
1214
#include <functional>
1315
#include <queue>
16+
#include <set>
1417

1518
namespace KINETO_NAMESPACE {
1619

@@ -25,8 +28,10 @@ class CuptiActivityInterface {
2528
static void pushCorrelationID(int id);
2629
static void popCorrelationID();
2730

28-
void enableCuptiActivities();
29-
void disableCuptiActivities();
31+
void enableCuptiActivities(
32+
const std::set<ActivityType>& selected_activities);
33+
void disableCuptiActivities(
34+
const std::set<ActivityType>& selected_activities);
3035
void clearActivities();
3136

3237
const std::pair<int, int> processActivities(

libkineto/src/CuptiActivityType.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
* All rights reserved.
4+
* This source code is licensed under the BSD-style license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#pragma once
9+
10+
namespace KINETO_NAMESPACE {
11+
12+
enum class ActivityType {
13+
MEMCPY,
14+
MEMSET,
15+
CONCURRENT_KERNEL,
16+
EXTERNAL_CORRELATION,
17+
RUNTIME
18+
};
19+
20+
} // namespace KINETO_NAMESPACE

libkineto/test/ConfigTest.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,48 @@ TEST(ParseTest, Format) {
6969
EXPECT_EQ(cfg.metricNames(), std::set<std::string>({"4", "5", "s i x"}));
7070
}
7171

72+
TEST(ParseTest, DefaultActivityTypes) {
73+
Config cfg;
74+
cfg.validate();
75+
EXPECT_EQ(cfg.selectedActivityTypes(),
76+
std::set<ActivityType>({ActivityType::MEMCPY,
77+
ActivityType::MEMSET,
78+
ActivityType::CONCURRENT_KERNEL,
79+
ActivityType::EXTERNAL_CORRELATION,
80+
ActivityType::RUNTIME}));
81+
}
82+
83+
TEST(ParseTest, ActivityTypes) {
84+
Config cfg;
85+
EXPECT_FALSE(cfg.parse("ACTIVITY_TYPES"));
86+
EXPECT_TRUE(cfg.parse("ACTIVITY_TYPES="));
87+
EXPECT_FALSE(cfg.parse("=ACTIVITY_TYPES="));
88+
89+
EXPECT_TRUE(cfg.parse("ACTIVITY_TYPES=gpu_memcpy,gpu_MeMsEt,concurrent_kernel"));
90+
EXPECT_EQ(cfg.selectedActivityTypes(),
91+
std::set<ActivityType>({ActivityType::MEMCPY,
92+
ActivityType::MEMSET,
93+
ActivityType::CONCURRENT_KERNEL}));
94+
95+
EXPECT_TRUE(cfg.parse("ACTIVITY_TYPES = cuda_Runtime,"));
96+
EXPECT_EQ(cfg.selectedActivityTypes(),
97+
std::set<ActivityType>({ActivityType::MEMCPY,
98+
ActivityType::MEMSET,
99+
ActivityType::RUNTIME,
100+
ActivityType::CONCURRENT_KERNEL}));
101+
102+
// Should throw an exception because incorrect activity name
103+
EXPECT_FALSE(cfg.parse("ACTIVITY_TYPES = memcopy,cuda_runtime"));
104+
105+
EXPECT_TRUE(cfg.parse("ACTIVITY_TYPES = external_correlation"));
106+
EXPECT_EQ(cfg.selectedActivityTypes(),
107+
std::set<ActivityType>({ActivityType::MEMCPY,
108+
ActivityType::MEMSET,
109+
ActivityType::CONCURRENT_KERNEL,
110+
ActivityType::EXTERNAL_CORRELATION,
111+
ActivityType::RUNTIME}));
112+
}
113+
72114
TEST(ParseTest, SamplePeriod) {
73115
Config cfg;
74116
EXPECT_TRUE(cfg.parse("SAMPLE_PERIOD_MSECS=10"));

0 commit comments

Comments
 (0)