Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions src/alpakatest/AlpakaCore/Context.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#ifndef HeterogeneousCore_AlpakaCore_Context_h
#define HeterogeneousCore_AlpakaCore_Context_h

#include "AlpakaCore/alpakaConfigFwd.h"

#include <memory>

namespace ALPAKA_ACCELERATOR_NAMESPACE {
/**
* Lightweight, non-owning helper to deliver the Queue to the device kernels
*/
class Context {
public:
Context(Queue* queue, bool* queueUsed) : queue_(queue), queueUsed_(queueUsed) {}

// prevent copying and moving
Context(Context const&) = delete;
Context& operator=(Context const&) = delete;
Context(Context&&) = delete;
Context& operator=(Context&&) = delete;

Queue& queue() {
*queueUsed_ = true;
return *queue_;
}

private:
Queue* queue_;
bool* queueUsed_;
};
}

#endif
91 changes: 0 additions & 91 deletions src/alpakatest/AlpakaCore/ContextState.h

This file was deleted.

45 changes: 45 additions & 0 deletions src/alpakatest/AlpakaCore/EDContext.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef HeterogeneousCore_AlpakaCore_EDContext_h
#define HeterogeneousCore_AlpakaCore_EDContext_h

#include <memory>

#include "AlpakaCore/FwkContextBase.h"
#include "AlpakaCore/ProductMetadata.h"
#include "DataFormats/Product.h"
#include "Framework/WaitingTaskWithArenaHolder.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {
class EDContext : public impl::FwkContextBase {
public:
// For ExternalWork module
// In acquire()
EDContext(edm::StreamID stream, edm::WaitingTaskWithArenaHolder holder) : FwkContextBase(stream), waitingTaskHolder_(std::move(holder)) {}
// In produce()
EDContext(std::shared_ptr<ProductMetadata> metadata) : FwkContextBase(std::move(metadata)) {}

// For non-ExternalWork module
EDContext(edm::StreamID stream) : FwkContextBase(stream) {}

EDContext(EDContext const&) = delete;
EDContext& operator=(EDContext const&) = delete;
EDContext(EDContext&&) = delete;
EDContext& operator=(EDContext&&) = delete;

template <typename T>
T const& get(edm::Product<T> const& data) {
reuseAndSynchronizeQueue(data);
return data.data();
}

std::shared_ptr<ProductMetadata> finishAcquire();

void finishProduce();

private:
void reuseAndSynchronizeQueue(edm::ProductBase const& data);

edm::WaitingTaskWithArenaHolder waitingTaskHolder_;
};
}

#endif
114 changes: 114 additions & 0 deletions src/alpakatest/AlpakaCore/EDProducer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#ifndef HeterogeneousCore_AlpakaCore_stream_EDProducer_h
#define HeterogeneousCore_AlpakaCore_stream_EDProducer_h

#include "AlpakaCore/alpakaConfigFwd.h"
#include "AlpakaCore/Event.h"
#include "DataFormats/Product.h"
#include "Framework/EDProducer.h"
#include "Framework/Host.h"
#include "Framework/ProductEDGetToken.h"
#include "Framework/ProductEDPutToken.h"
#include "Framework/ProductRegistry.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {
class Context;

namespace impl {
#ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_SYNC_BACKEND
template <typename T>
struct ConsumesHelper {
static edm::EDGetTokenT<T> consumes(edm::ProductRegistry& reg) {
return reg.consumes<T>();
}
};

template <typename T>
struct ProducesHelper {
static edm::EDPutTokenT<T> produces(edm::ProductRegistry& reg) {
return reg.produces<T>();
}
};

#else // asynchronous backends

template <typename T>
struct ConsumesHelper {
static edm::EDGetTokenT<T> consumes(edm::ProductRegistry& reg) {
return edm::ProductEDGetToken<T>::toToken(reg.consumes<edm::Product<T>>());
}
};

template <typename T>
struct ProducesHelper {
static edm::EDPutTokenT<T> produces(edm::ProductRegistry& reg) {
return edm::ProductEDPutToken<T>::toToken(reg.produces<edm::Product<T>>());
}
};
#endif

// Specializations for host products are the same
template <typename T>
struct ConsumesHelper<edm::Host<T>> {
static edm::EDGetTokenT<edm::Host<T>> consumes(edm::ProductRegistry& reg) {
return edm::ProductEDGetToken<T>::toHostToken(reg.consumes<T>());
}
};

template <typename T>
struct ProducesHelper<edm::Host<T>> {
static edm::EDGetTokenT<edm::Host<T>> produces(edm::ProductRegistry& reg) {
return edm::ProductEDPutToken<T>::toHostToken(reg.produces<T>());
}
};
}

class EDProducer : public edm::EDProducer {
public:
EDProducer(edm::ProductRegistry& reg) : reg_(&reg) {}
~EDProducer() override = default;

template <typename T>
edm::EDGetTokenT<T> consumes() {
return impl::ConsumesHelper<T>::consumes(*reg_);
}

template <typename T>
edm::EDPutTokenT<T> produces() {
return impl::ProducesHelper<T>::produces(*reg_);
}

void produce(edm::Event& event, edm::EventSetup const& eventSetup) final;
virtual void produce(Event& event, edm::EventSetup const& eventSetup, Context& ctx) = 0;

private:
edm::ProductRegistry *reg_;
};

class EDProducerExternalWork : public edm::EDProducerExternalWork {
public:
EDProducerExternalWork(edm::ProductRegistry& reg) : reg_(&reg) {}
~EDProducerExternalWork() override = default;

template <typename T>
edm::EDGetTokenT<T> consumes() {
return impl::ConsumesHelper<T>::consumes(*reg_);
}

template <typename T>
edm::EDPutTokenT<T> produces() {
return impl::ProducesHelper<T>::produces(*reg_);
}

void acquire(edm::Event const& event, edm::EventSetup const& eventSetup, edm::WaitingTaskWithArenaHolder holder) final;
virtual void acquire(Event const& event, edm::EventSetup const& eventSetup, Context& ctx) = 0;

void produce(edm::Event& event, edm::EventSetup const& eventSetup) final;
virtual void produce(Event& event, edm::EventSetup const& eventSetup, Context& ctx) = 0;

private:
edm::ProductRegistry *reg_;
std::shared_ptr<ProductMetadata> metadata_;
};
}

#endif
88 changes: 88 additions & 0 deletions src/alpakatest/AlpakaCore/Event.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#ifndef HeterogeneousCore_AlpakaCore_Event_h
#define HeterogeneousCore_AlpakaCore_Event_h

#include "AlpakaCore/alpakaConfigFwd.h"
#include "AlpakaCore/EDContext.h"
#include "AlpakaCore/ProductMetadata.h"
#include "Framework/Event.h"
#include "Framework/ProductEDGetToken.h"
#include "Framework/ProductEDPutToken.h"

namespace ALPAKA_ACCELERATOR_NAMESPACE {
namespace impl {
#ifdef ALPAKA_ACC_CPU_B_SEQ_T_SEQ_SYNC_BACKEND
template <typename T>
struct GetHelper {
static auto const& get(edm::Event const& event, EDContext& ctx, edm::EDGetTokenT<T> const& token) {
return event.get(token);
}
};

template <typename T>
struct EmplaceHelper {
template <typename... Args>
static void emplace(edm::Event& event, EDContext& ctx, edm::EDPutTokenT<T> const& token, Args&&... args) {
event.emplace(token, std::forward<Args>(args)...);
}
};
#else // asynchronous backends
template <typename T>
struct GetHelper {
static auto const& get(edm::Event const& event, EDContext& ctx, edm::EDGetTokenT<T> const& token) {
auto const& product = event.get(edm::ProductEDGetToken<T>::toProductToken(token));
return ctx.get(product);
}
};

template <typename T>
struct EmplaceHelper {
template <typename... Args>
static void emplace(edm::Event& event, EDContext& ctx, edm::EDPutTokenT<T> const& token, Args&&... args) {
event.emplace(edm::ProductEDPutToken<T>::toProductToken(token), ctx.metadataPtr(), std::forward<Args>(args)...);
}
};
#endif

// Specializations for host products are the same
template <typename T>
struct GetHelper<edm::Host<T>> {
static auto const& get(edm::Event const& event, EDContext& ctx, edm::EDGetTokenT<edm::Host<T>> const& token) {
return event.get(edm::ProductEDGetToken<T>::toToken(token));
}
};

template <typename T>
struct EmplaceHelper<edm::Host<T>> {
template <typename... Args>
static void emplace(edm::Event& event, EDContext& ctx, edm::EDPutTokenT<edm::Host<T>> const& token, Args&&... args) {
event.emplace(edm::ProductEDPutToken<T>::toToken(token), ctx.metadataPtr(), std::forward<Args>(args)...);
}
};
}

class Event {
public:
Event(edm::Event const& ev, EDContext& ctx): constEvent_(ev), ctx_(ctx) {}
Event(edm::Event& ev, EDContext& ctx): constEvent_(ev), event_(&ev), ctx_(ctx) {}

auto streamID() const { return constEvent_.streamID(); }
auto eventID() const { return constEvent_.eventID(); }

template <typename T>
auto const& get(edm::EDGetTokenT<T> const& token) const {
return impl::GetHelper<T>::get(constEvent_, ctx_, token);
}

template <typename T, typename... Args>
void emplace(edm::EDPutTokenT<T> const& token, Args&&... args) {
impl::EmplaceHelper<T>::emplace(*event_, ctx_, token, std::forward<Args>(args)...);
}

private:
edm::Event const& constEvent_;
edm::Event* event_ = nullptr;
EDContext& ctx_;
};
}

#endif
Loading