Index: parallel-libs/trunk/streamexecutor/include/streamexecutor/Executor.h =================================================================== --- parallel-libs/trunk/streamexecutor/include/streamexecutor/Executor.h +++ parallel-libs/trunk/streamexecutor/include/streamexecutor/Executor.h @@ -0,0 +1,47 @@ +//===-- Executor.h - The Executor class -------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// The Executor class which represents a single device of a specific platform. +/// +//===----------------------------------------------------------------------===// + +#ifndef STREAMEXECUTOR_EXECUTOR_H +#define STREAMEXECUTOR_EXECUTOR_H + +#include "streamexecutor/KernelSpec.h" +#include "streamexecutor/Utils/Error.h" + +namespace streamexecutor { + +class KernelInterface; +class PlatformExecutor; +class Stream; + +class Executor { +public: + explicit Executor(PlatformExecutor *PExecutor); + virtual ~Executor(); + + /// Gets the kernel implementation for the underlying platform. + virtual Expected> + getKernelImplementation(const MultiKernelLoaderSpec &Spec) { + // TODO(jhen): Implement this. + return nullptr; + } + + Expected> createStream(); + +private: + PlatformExecutor *PExecutor; +}; + +} // namespace streamexecutor + +#endif // STREAMEXECUTOR_EXECUTOR_H Index: parallel-libs/trunk/streamexecutor/include/streamexecutor/Kernel.h =================================================================== --- parallel-libs/trunk/streamexecutor/include/streamexecutor/Kernel.h +++ parallel-libs/trunk/streamexecutor/include/streamexecutor/Kernel.h @@ -84,8 +84,8 @@ namespace streamexecutor { +class Executor; class KernelInterface; -class StreamExecutor; /// The base class for device kernel functions. /// @@ -100,13 +100,13 @@ KernelBase &operator=(KernelBase &&) = default; ~KernelBase(); - /// Creates a kernel object from a StreamExecutor and a MultiKernelLoaderSpec. + /// Creates a kernel object from an Executor and a MultiKernelLoaderSpec. /// - /// The StreamExecutor knows which platform it belongs to and the + /// The Executor knows which platform it belongs to and the /// MultiKernelLoaderSpec knows how to find the kernel code for different /// platforms, so the combined information is enough to get the kernel code /// for the appropriate platform. - static Expected create(StreamExecutor *ParentExecutor, + static Expected create(Executor *ParentExecutor, const MultiKernelLoaderSpec &Spec); const std::string &getName() const { return Name; } @@ -116,11 +116,11 @@ KernelInterface *getImplementation() { return Implementation.get(); } private: - KernelBase(StreamExecutor *ParentExecutor, const std::string &Name, + KernelBase(Executor *ParentExecutor, const std::string &Name, const std::string &DemangledName, std::unique_ptr Implementation); - StreamExecutor *ParentExecutor; + Executor *ParentExecutor; std::string Name; std::string DemangledName; std::unique_ptr Implementation; @@ -136,7 +136,7 @@ TypedKernel &operator=(TypedKernel &&) = default; /// Parameters here have the same meaning as in KernelBase::create. - static Expected create(StreamExecutor *ParentExecutor, + static Expected create(Executor *ParentExecutor, const MultiKernelLoaderSpec &Spec) { auto MaybeBase = KernelBase::create(ParentExecutor, Spec); if (!MaybeBase) { Index: parallel-libs/trunk/streamexecutor/include/streamexecutor/PlatformInterfaces.h =================================================================== --- parallel-libs/trunk/streamexecutor/include/streamexecutor/PlatformInterfaces.h +++ parallel-libs/trunk/streamexecutor/include/streamexecutor/PlatformInterfaces.h @@ -31,7 +31,7 @@ namespace streamexecutor { -class PlatformStreamExecutor; +class PlatformExecutor; /// Methods supported by device kernel function objects on all platforms. class KernelInterface { @@ -41,15 +41,15 @@ /// Platform-specific stream handle. class PlatformStreamHandle { public: - explicit PlatformStreamHandle(PlatformStreamExecutor *Executor) - : Executor(Executor) {} + explicit PlatformStreamHandle(PlatformExecutor *PExecutor) + : PExecutor(PExecutor) {} virtual ~PlatformStreamHandle(); - PlatformStreamExecutor *getExecutor() { return Executor; } + PlatformExecutor *getExecutor() { return PExecutor; } private: - PlatformStreamExecutor *Executor; + PlatformExecutor *PExecutor; }; /// Raw executor methods that must be implemented by each platform. @@ -57,11 +57,11 @@ /// This class defines the platform interface that supports executing work on a /// device. /// -/// The public StreamExecutor and Stream classes have the type-safe versions of -/// the functions in this interface. -class PlatformStreamExecutor { +/// The public Executor and Stream classes have the type-safe versions of the +/// functions in this interface. +class PlatformExecutor { public: - virtual ~PlatformStreamExecutor(); + virtual ~PlatformExecutor(); virtual std::string getName() const = 0; Index: parallel-libs/trunk/streamexecutor/include/streamexecutor/Stream.h =================================================================== --- parallel-libs/trunk/streamexecutor/include/streamexecutor/Stream.h +++ parallel-libs/trunk/streamexecutor/include/streamexecutor/Stream.h @@ -12,17 +12,17 @@ /// A Stream instance represents a queue of sequential, host-asynchronous work /// to be performed on a device. /// -/// To enqueue work on a device, first create a StreamExecutor instance for a -/// given device and then use that StreamExecutor to create a Stream instance. +/// To enqueue work on a device, first create a Executor instance for a +/// given device and then use that Executor to create a Stream instance. /// The Stream instance will perform its work on the device managed by the -/// StreamExecutor that created it. +/// Executor that created it. /// /// The various "then" methods of the Stream object, such as thenMemcpyH2D and /// thenLaunch, may be used to enqueue work on the Stream, and the /// blockHostUntilDone() method may be used to block the host code until the /// Stream has completed all its work. /// -/// Multiple Stream instances can be created for the same StreamExecutor. This +/// Multiple Stream instances can be created for the same Executor. This /// allows several independent streams of computation to be performed /// simultaneously on a single device. /// @@ -94,8 +94,8 @@ const ParameterTs &... Arguments) { auto ArgumentArray = make_kernel_argument_pack(Arguments...); - setError(PlatformExecutor->launch(ThePlatformStream.get(), BlockSize, - GridSize, Kernel, ArgumentArray)); + setError(PExecutor->launch(ThePlatformStream.get(), BlockSize, GridSize, + Kernel, ArgumentArray)); return *this; } @@ -103,8 +103,8 @@ /// device source to a host destination. /// /// HostDst must be a pointer to host memory allocated by - /// StreamExecutor::allocateHostMemory or otherwise allocated and then - /// registered with StreamExecutor::registerHostMemory. + /// Executor::allocateHostMemory or otherwise allocated and then + /// registered with Executor::registerHostMemory. template Stream &thenMemcpyD2H(const GlobalDeviceMemory &DeviceSrc, llvm::MutableArrayRef HostDst, size_t ElementCount) { @@ -116,9 +116,8 @@ setError("copying too many elements, " + llvm::Twine(ElementCount) + ", to host array of size " + llvm::Twine(HostDst.size())); else - setError(PlatformExecutor->memcpyD2H(ThePlatformStream.get(), DeviceSrc, - HostDst.data(), - ElementCount * sizeof(T))); + setError(PExecutor->memcpyD2H(ThePlatformStream.get(), DeviceSrc, + HostDst.data(), ElementCount * sizeof(T))); return *this; } @@ -134,8 +133,8 @@ /// source to a device destination. /// /// HostSrc must be a pointer to host memory allocated by - /// StreamExecutor::allocateHostMemory or otherwise allocated and then - /// registered with StreamExecutor::registerHostMemory. + /// Executor::allocateHostMemory or otherwise allocated and then + /// registered with Executor::registerHostMemory. template Stream &thenMemcpyH2D(llvm::ArrayRef HostSrc, GlobalDeviceMemory *DeviceDst, size_t ElementCount) { @@ -147,9 +146,8 @@ ", to device memory array of size " + llvm::Twine(DeviceDst->getElementCount())); else - setError(PlatformExecutor->memcpyH2D(ThePlatformStream.get(), - HostSrc.data(), DeviceDst, - ElementCount * sizeof(T))); + setError(PExecutor->memcpyH2D(ThePlatformStream.get(), HostSrc.data(), + DeviceDst, ElementCount * sizeof(T))); return *this; } @@ -175,9 +173,8 @@ ", to device memory array of size " + llvm::Twine(DeviceDst->getElementCount())); else - setError(PlatformExecutor->memcpyD2D(ThePlatformStream.get(), DeviceSrc, - DeviceDst, - ElementCount * sizeof(T))); + setError(PExecutor->memcpyD2D(ThePlatformStream.get(), DeviceSrc, + DeviceDst, ElementCount * sizeof(T))); return *this; } @@ -194,7 +191,7 @@ /// /// Returns true if there are no errors on the stream. bool blockHostUntilDone() { - Error E = PlatformExecutor->blockHostUntilDone(ThePlatformStream.get()); + Error E = PExecutor->blockHostUntilDone(ThePlatformStream.get()); bool returnValue = static_cast(E); setError(std::move(E)); return returnValue; @@ -221,8 +218,8 @@ ErrorMessage = Message.str(); } - /// The PlatformStreamExecutor that supports the operations of this stream. - PlatformStreamExecutor *PlatformExecutor; + /// The PlatformExecutor that supports the operations of this stream. + PlatformExecutor *PExecutor; /// The platform-specific stream handle for this instance. std::unique_ptr ThePlatformStream; Index: parallel-libs/trunk/streamexecutor/include/streamexecutor/StreamExecutor.h =================================================================== --- parallel-libs/trunk/streamexecutor/include/streamexecutor/StreamExecutor.h +++ parallel-libs/trunk/streamexecutor/include/streamexecutor/StreamExecutor.h @@ -1,48 +0,0 @@ -//===-- StreamExecutor.h - The StreamExecutor class -------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// -/// \file -/// The StreamExecutor class which represents a single device of a specific -/// platform. -/// -//===----------------------------------------------------------------------===// - -#ifndef STREAMEXECUTOR_STREAMEXECUTOR_H -#define STREAMEXECUTOR_STREAMEXECUTOR_H - -#include "streamexecutor/KernelSpec.h" -#include "streamexecutor/Utils/Error.h" - -namespace streamexecutor { - -class KernelInterface; -class PlatformStreamExecutor; -class Stream; - -class StreamExecutor { -public: - explicit StreamExecutor(PlatformStreamExecutor *PlatformExecutor); - virtual ~StreamExecutor(); - - /// Gets the kernel implementation for the underlying platform. - virtual Expected> - getKernelImplementation(const MultiKernelLoaderSpec &Spec) { - // TODO(jhen): Implement this. - return nullptr; - } - - Expected> createStream(); - -private: - PlatformStreamExecutor *PlatformExecutor; -}; - -} // namespace streamexecutor - -#endif // STREAMEXECUTOR_STREAMEXECUTOR_H Index: parallel-libs/trunk/streamexecutor/lib/CMakeLists.txt =================================================================== --- parallel-libs/trunk/streamexecutor/lib/CMakeLists.txt +++ parallel-libs/trunk/streamexecutor/lib/CMakeLists.txt @@ -6,12 +6,12 @@ add_library( streamexecutor $ + Executor.cpp Kernel.cpp KernelSpec.cpp PackedKernelArgumentArray.cpp PlatformInterfaces.cpp - Stream.cpp - StreamExecutor.cpp) + Stream.cpp) target_link_libraries(streamexecutor ${llvm_libs}) if(STREAM_EXECUTOR_UNIT_TESTS) Index: parallel-libs/trunk/streamexecutor/lib/Executor.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/Executor.cpp +++ parallel-libs/trunk/streamexecutor/lib/Executor.cpp @@ -0,0 +1,41 @@ +//===-- Executor.cpp - Executor implementation ----------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// Implementation of Executor class internals. +/// +//===----------------------------------------------------------------------===// + +#include "streamexecutor/Executor.h" + +#include + +#include "streamexecutor/PlatformInterfaces.h" +#include "streamexecutor/Stream.h" + +#include "llvm/ADT/STLExtras.h" + +namespace streamexecutor { + +Executor::Executor(PlatformExecutor *PExecutor) : PExecutor(PExecutor) {} + +Executor::~Executor() = default; + +Expected> Executor::createStream() { + Expected> MaybePlatformStream = + PExecutor->createStream(); + if (!MaybePlatformStream) { + return MaybePlatformStream.takeError(); + } + assert((*MaybePlatformStream)->getExecutor() == PExecutor && + "an executor created a stream with a different stored executor"); + return llvm::make_unique(std::move(*MaybePlatformStream)); +} + +} // namespace streamexecutor Index: parallel-libs/trunk/streamexecutor/lib/Kernel.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/Kernel.cpp +++ parallel-libs/trunk/streamexecutor/lib/Kernel.cpp @@ -13,14 +13,14 @@ //===----------------------------------------------------------------------===// #include "streamexecutor/Kernel.h" +#include "streamexecutor/Executor.h" #include "streamexecutor/PlatformInterfaces.h" -#include "streamexecutor/StreamExecutor.h" #include "llvm/DebugInfo/Symbolize/Symbolize.h" namespace streamexecutor { -KernelBase::KernelBase(StreamExecutor *ParentExecutor, const std::string &Name, +KernelBase::KernelBase(Executor *ParentExecutor, const std::string &Name, const std::string &DemangledName, std::unique_ptr Implementation) : ParentExecutor(ParentExecutor), Name(Name), DemangledName(DemangledName), @@ -28,7 +28,7 @@ KernelBase::~KernelBase() = default; -Expected KernelBase::create(StreamExecutor *ParentExecutor, +Expected KernelBase::create(Executor *ParentExecutor, const MultiKernelLoaderSpec &Spec) { auto MaybeImplementation = ParentExecutor->getKernelImplementation(Spec); if (!MaybeImplementation) { Index: parallel-libs/trunk/streamexecutor/lib/PlatformInterfaces.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/PlatformInterfaces.cpp +++ parallel-libs/trunk/streamexecutor/lib/PlatformInterfaces.cpp @@ -18,6 +18,6 @@ PlatformStreamHandle::~PlatformStreamHandle() = default; -PlatformStreamExecutor::~PlatformStreamExecutor() = default; +PlatformExecutor::~PlatformExecutor() = default; } // namespace streamexecutor Index: parallel-libs/trunk/streamexecutor/lib/Stream.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/Stream.cpp +++ parallel-libs/trunk/streamexecutor/lib/Stream.cpp @@ -17,8 +17,8 @@ namespace streamexecutor { Stream::Stream(std::unique_ptr PStream) - : PlatformExecutor(PStream->getExecutor()), - ThePlatformStream(std::move(PStream)) {} + : PExecutor(PStream->getExecutor()), ThePlatformStream(std::move(PStream)) { +} Stream::~Stream() = default; Index: parallel-libs/trunk/streamexecutor/lib/StreamExecutor.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/StreamExecutor.cpp +++ parallel-libs/trunk/streamexecutor/lib/StreamExecutor.cpp @@ -1,42 +0,0 @@ -//===-- StreamExecutor.cpp - StreamExecutor implementation ----------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// -/// \file -/// Implementation of StreamExecutor class internals. -/// -//===----------------------------------------------------------------------===// - -#include "streamexecutor/StreamExecutor.h" - -#include - -#include "streamexecutor/PlatformInterfaces.h" -#include "streamexecutor/Stream.h" - -#include "llvm/ADT/STLExtras.h" - -namespace streamexecutor { - -StreamExecutor::StreamExecutor(PlatformStreamExecutor *PlatformExecutor) - : PlatformExecutor(PlatformExecutor) {} - -StreamExecutor::~StreamExecutor() = default; - -Expected> StreamExecutor::createStream() { - Expected> MaybePlatformStream = - PlatformExecutor->createStream(); - if (!MaybePlatformStream) { - return MaybePlatformStream.takeError(); - } - assert((*MaybePlatformStream)->getExecutor() == PlatformExecutor && - "an executor created a stream with a different stored executor"); - return llvm::make_unique(std::move(*MaybePlatformStream)); -} - -} // namespace streamexecutor Index: parallel-libs/trunk/streamexecutor/lib/unittests/KernelTest.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/unittests/KernelTest.cpp +++ parallel-libs/trunk/streamexecutor/lib/unittests/KernelTest.cpp @@ -14,10 +14,10 @@ #include +#include "streamexecutor/Executor.h" #include "streamexecutor/Kernel.h" #include "streamexecutor/KernelSpec.h" #include "streamexecutor/PlatformInterfaces.h" -#include "streamexecutor/StreamExecutor.h" #include "llvm/ADT/STLExtras.h" @@ -27,7 +27,7 @@ namespace se = ::streamexecutor; -// A StreamExecutor that returns a dummy KernelInterface. +// An Executor that returns a dummy KernelInterface. // // During construction it creates a unique_ptr to a dummy KernelInterface and it // also stores a separate copy of the raw pointer that is stored by that @@ -39,11 +39,11 @@ // object. The raw pointer copy can then be used to identify the unique_ptr in // its new location (by comparing the raw pointer with unique_ptr::get), to // verify that the unique_ptr ended up where it was supposed to be. -class MockStreamExecutor : public se::StreamExecutor { +class MockExecutor : public se::Executor { public: - MockStreamExecutor() - : se::StreamExecutor(nullptr), - Unique(llvm::make_unique()), Raw(Unique.get()) {} + MockExecutor() + : se::Executor(nullptr), Unique(llvm::make_unique()), + Raw(Unique.get()) {} // Moves the unique pointer into the returned se::Expected instance. // @@ -51,7 +51,7 @@ // out. se::Expected> getKernelImplementation(const se::MultiKernelLoaderSpec &) override { - assert(Unique && "MockStreamExecutor getKernelImplementation should not be " + assert(Unique && "MockExecutor getKernelImplementation should not be " "called more than once"); return std::move(Unique); } @@ -79,10 +79,10 @@ // Tests that the kernel create functions properly fetch the implementation // pointers for the kernel objects they construct from the passed-in -// StreamExecutor objects. +// Executor objects. TYPED_TEST(GetImplementationTest, SetImplementationDuringCreate) { se::MultiKernelLoaderSpec Spec; - MockStreamExecutor MockExecutor; + MockExecutor MockExecutor; auto MaybeKernel = TypeParam::create(&MockExecutor, Spec); EXPECT_TRUE(static_cast(MaybeKernel)); Index: parallel-libs/trunk/streamexecutor/lib/unittests/StreamTest.cpp =================================================================== --- parallel-libs/trunk/streamexecutor/lib/unittests/StreamTest.cpp +++ parallel-libs/trunk/streamexecutor/lib/unittests/StreamTest.cpp @@ -14,11 +14,11 @@ #include +#include "streamexecutor/Executor.h" #include "streamexecutor/Kernel.h" #include "streamexecutor/KernelSpec.h" #include "streamexecutor/PlatformInterfaces.h" #include "streamexecutor/Stream.h" -#include "streamexecutor/StreamExecutor.h" #include "gtest/gtest.h" @@ -26,14 +26,14 @@ namespace se = ::streamexecutor; -/// Mock PlatformStreamExecutor that performs asynchronous memcpy operations by +/// Mock PlatformExecutor that performs asynchronous memcpy operations by /// ignoring the stream argument and calling std::memcpy on device memory /// handles. -class MockPlatformStreamExecutor : public se::PlatformStreamExecutor { +class MockPlatformExecutor : public se::PlatformExecutor { public: - ~MockPlatformStreamExecutor() override {} + ~MockPlatformExecutor() override {} - std::string getName() const override { return "MockPlatformStreamExecutor"; } + std::string getName() const override { return "MockPlatformExecutor"; } se::Expected> createStream() override { @@ -70,8 +70,7 @@ StreamTest() : DeviceA(se::GlobalDeviceMemory::makeFromElementCount(HostA, 10)), DeviceB(se::GlobalDeviceMemory::makeFromElementCount(HostB, 10)), - Stream(llvm::make_unique(&PlatformExecutor)) { - } + Stream(llvm::make_unique(&PExecutor)) {} protected: // Device memory is backed by host arrays. @@ -83,7 +82,7 @@ // Host memory to be used as actual host memory. int Host[10]; - MockPlatformStreamExecutor PlatformExecutor; + MockPlatformExecutor PExecutor; se::Stream Stream; };