libkineto.h 3.8 KB

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