libkineto.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #if !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)
  2. /*
  3. * Copyright (c) Meta Platforms, Inc. and affiliates.
  4. * All rights reserved.
  5. *
  6. * This source code is licensed under the BSD-style license found in the
  7. * LICENSE file in the root directory of this source tree.
  8. */
  9. // Mediator for initialization and profiler control
  10. #pragma once
  11. #include <atomic>
  12. #include <chrono>
  13. #include <deque>
  14. #include <functional>
  15. #include <memory>
  16. #include <mutex>
  17. #include <set>
  18. #include <string>
  19. #include <thread>
  20. #include <vector>
  21. #include "ActivityProfilerInterface.h"
  22. #include "ActivityTraceInterface.h"
  23. #include "ActivityType.h"
  24. #include "ClientInterface.h"
  25. #include "GenericTraceActivity.h"
  26. #include "IActivityProfiler.h"
  27. #include "ILoggerObserver.h"
  28. #include "LoggingAPI.h"
  29. #include "TraceSpan.h"
  30. #include "ThreadUtil.h"
  31. extern "C" {
  32. void suppressLibkinetoLogMessages();
  33. int InitializeInjection(void);
  34. void libkineto_init(bool cpuOnly, bool logOnError);
  35. bool hasTestEnvVar();
  36. }
  37. namespace libkineto {
  38. class Config;
  39. class ConfigLoader;
  40. struct CpuTraceBuffer {
  41. template <class... Args>
  42. void emplace_activity(Args&&... args) {
  43. activities.emplace_back(
  44. std::make_unique<GenericTraceActivity>(std::forward<Args>(args)...));
  45. }
  46. static GenericTraceActivity& toRef(
  47. std::unique_ptr<GenericTraceActivity>& ref) {
  48. return *ref;
  49. }
  50. static const GenericTraceActivity& toRef(
  51. const std::unique_ptr<GenericTraceActivity>& ref) {
  52. return *ref;
  53. }
  54. TraceSpan span{0, 0, "none"};
  55. int gpuOpCount;
  56. std::deque<std::unique_ptr<GenericTraceActivity>> activities;
  57. };
  58. using ChildActivityProfilerFactory =
  59. std::function<std::unique_ptr<IActivityProfiler>()>;
  60. class LibkinetoApi {
  61. public:
  62. explicit LibkinetoApi(ConfigLoader& configLoader)
  63. : configLoader_(configLoader) {}
  64. // Called by client that supports tracing API.
  65. // libkineto can still function without this.
  66. void registerClient(ClientInterface* client);
  67. // Called by libkineto on init
  68. void registerProfiler(std::unique_ptr<ActivityProfilerInterface> profiler) {
  69. activityProfiler_ = std::move(profiler);
  70. initClientIfRegistered();
  71. }
  72. ActivityProfilerInterface& activityProfiler() {
  73. return *activityProfiler_;
  74. }
  75. ClientInterface* client() {
  76. return client_;
  77. }
  78. void initProfilerIfRegistered() {
  79. static std::once_flag once;
  80. if (activityProfiler_) {
  81. std::call_once(once, [this] {
  82. if (!activityProfiler_->isInitialized()) {
  83. activityProfiler_->init();
  84. initChildActivityProfilers();
  85. }
  86. });
  87. }
  88. }
  89. [[nodiscard]] bool isProfilerInitialized() const {
  90. return activityProfiler_ && activityProfiler_->isInitialized();
  91. }
  92. [[nodiscard]] bool isProfilerRegistered() const {
  93. return activityProfiler_ != nullptr;
  94. }
  95. void suppressLogMessages() {
  96. suppressLibkinetoLogMessages();
  97. }
  98. void resetKinetoTLS() {
  99. resetTLS();
  100. }
  101. // Provides access to profier configuration manaegement
  102. ConfigLoader& configLoader() {
  103. return configLoader_;
  104. }
  105. void registerProfilerFactory(const ChildActivityProfilerFactory& factory) {
  106. if (isProfilerInitialized()) {
  107. activityProfiler_->addChildActivityProfiler(factory());
  108. } else {
  109. childProfilerFactories_.push_back(factory);
  110. }
  111. }
  112. private:
  113. void initChildActivityProfilers() {
  114. if (!isProfilerInitialized()) {
  115. return;
  116. }
  117. for (const auto& factory : childProfilerFactories_) {
  118. activityProfiler_->addChildActivityProfiler(factory());
  119. }
  120. childProfilerFactories_.clear();
  121. }
  122. // Client is initialized once both it and libkineto has registered
  123. void initClientIfRegistered();
  124. ConfigLoader& configLoader_;
  125. std::unique_ptr<ActivityProfilerInterface> activityProfiler_;
  126. ClientInterface* client_{};
  127. int32_t clientRegisterThread_{0};
  128. std::vector<ChildActivityProfilerFactory> childProfilerFactories_;
  129. };
  130. // Singleton
  131. LibkinetoApi& api();
  132. } // namespace libkineto
  133. #else
  134. #error "This file should not be included when either TORCH_STABLE_ONLY or TORCH_TARGET_VERSION is defined."
  135. #endif // !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)