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