mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 12:54:11 +08:00
Summary: Resubmit #20698 which got messed up. Idea is that when PyTorch is used in a custom build environment (e.g. Facebook), it's useful to track usage of various APIs centrally. This PR introduces a simple very lightweight mechanism to do so - only first invocation of a trigger point would be logged. This is significantly more lightweight than #18235 and thus we can allow to put logging in e.g. TensorImpl. Also adds an initial list of trigger points. Trigger points are added in such a way that no static initialization triggers them, i.e. just linking with libtorch.so will not cause any logging. Further suggestions of what to log are welcomed. Pull Request resolved: https://github.com/pytorch/pytorch/pull/20745 Differential Revision: D15429196 Pulled By: dzhulgakov fbshipit-source-id: a5e41a709a65b7ebccc6b95f93854e583cf20aca
59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
/**
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
|
*
|
|
* 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 "benchmark/benchmark.h"
|
|
|
|
#include <c10/util/Logging.h>
|
|
|
|
#if defined(__GNUC__)
|
|
#define NOINLINE __attribute__((noinline))
|
|
#else
|
|
#define NOINLINE
|
|
#endif
|
|
|
|
NOINLINE int call(int id) {
|
|
C10_LOG_API_USAGE_ONCE("bla");
|
|
return id%2;
|
|
}
|
|
|
|
NOINLINE int call_no_logging(int id) {
|
|
return id%2;
|
|
}
|
|
|
|
static void BM_APILogging(benchmark::State& state) {
|
|
int id = 0;
|
|
while (state.KeepRunning()) {
|
|
for (int i = 0; i < 1000; ++i) {
|
|
id += 1 + call(id);
|
|
}
|
|
}
|
|
benchmark::DoNotOptimize(id);
|
|
}
|
|
BENCHMARK(BM_APILogging);
|
|
|
|
static void BM_NoAPILogging(benchmark::State& state) {
|
|
int id = 0;
|
|
while (state.KeepRunning()) {
|
|
for (int i = 0; i < 1000; ++i) {
|
|
id += 1 + call_no_logging(id);
|
|
}
|
|
}
|
|
benchmark::DoNotOptimize(id);
|
|
}
|
|
BENCHMARK(BM_NoAPILogging);
|
|
|
|
BENCHMARK_MAIN();
|