1122cdce33e3e0a01a7f82645617317530aa571fbA. Unique TensorFlower/* Copyright 2015 The TensorFlow Authors. All Rights Reserved.
29c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
39c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurLicensed under the Apache License, Version 2.0 (the "License");
49c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudluryou may not use this file except in compliance with the License.
59c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurYou may obtain a copy of the License at
69c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
79c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur    http://www.apache.org/licenses/LICENSE-2.0
89c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
99c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurUnless required by applicable law or agreed to in writing, software
109c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurdistributed under the License is distributed on an "AS IS" BASIS,
119c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
129c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath KudlurSee the License for the specific language governing permissions and
139c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlurlimitations under the License.
149c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur==============================================================================*/
159c3043ff3bf31a6a81810b4ce9e87ef936f1f529Manjunath Kudlur
16f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#ifndef TENSORFLOW_STREAM_EXECUTOR_EVENT_H_
17f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#define TENSORFLOW_STREAM_EXECUTOR_EVENT_H_
18f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
19f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#include <memory>
20f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
21ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan#include "tensorflow/stream_executor/platform/port.h"
22ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan
23f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace perftools {
24f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace gputools {
25f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
26f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurnamespace internal {
27f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass EventInterface;
28f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}
29f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
30f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass Stream;
31f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass StreamExecutor;
32f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
33f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// The Event class, when supported by a platform, enables low-overhead status
34f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// reporting for a Stream. An Event is inserted at a location in a stream via
35f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// the Stream::ThenRecordEvent() API. From then on, the Event's status can be
36f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur// monitored via the nonblocking Event::PollForStatus() call.
37f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlurclass Event {
38f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur public:
39f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Potential states for an Event. If PollForStatus() returns anything aside
40f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // from kPending or kComplete, an error has occurred; kUnknown is a bad state.
41f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Not all implementations are able to return all enumeration values. Refer to
42f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // the platform-specific implementation for details.
43f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  enum class Status {
44f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    kUnknown,
45f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    kError,
46f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    kPending,
47f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur    kComplete,
48f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  };
49f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
50f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  explicit Event(StreamExecutor* stream_exec);  // NOLINT
51f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
52f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Releases any resources held by the Event object.
53f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  ~Event();
54f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
55f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Performs any platform-specific or potentially error-generating
56f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // initialization.
57f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  bool Init();
58f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
59f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Returns the current Status for the event.
60f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  Status PollForStatus();
61f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
62f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Returns a pointer to the underlying platform-specific implementation.
63f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  internal::EventInterface* implementation() { return implementation_.get(); }
64f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
65f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur private:
66f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  friend class Stream;
67f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
68ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan  // Pointer to the StreamExecutor interface used to create this object.
69ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan  // Not owned.
70ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan  StreamExecutor* stream_exec_;
71ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan
72f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // Pointer to the platform-specific EventInterface implementation underlying
73f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  // the object. Owned.
74f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur  std::unique_ptr<internal::EventInterface> implementation_;
75f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
76ddd4aaf5286de24ba70402ee0ec8b836d3aed8c7Vijay Vasudevan  SE_DISALLOW_COPY_AND_ASSIGN(Event);
77f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur};
78f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
79f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // namespace gputools
80f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur}  // namespace perftools
81f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur
82f41959ccb2d9d4c722fe8fc3351401d53bcf490Manjunath Kudlur#endif  // TENSORFLOW_STREAM_EXECUTOR_EVENT_H_
83