Skip to content

Commit 3ea842b

Browse files
committed
Add timespan calculation
1 parent 79d2105 commit 3ea842b

File tree

7 files changed

+40
-0
lines changed

7 files changed

+40
-0
lines changed

AbstractAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ struct AbstractAPI {
100100
virtual bool isEventCompleted(void* eventPtr) = 0;
101101
virtual void recordEventOnHost(void* eventPtr) = 0;
102102
virtual void recordEventOnStream(void* eventPtr, void* streamPtr) = 0;
103+
virtual double timespanEvents(void* eventPtrStart, void* eventPtrEnd) = 0;
103104

104105
virtual bool isUnifiedMemoryDefault() = 0;
105106

interfaces/cuda/CudaWrappedAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class ConcreteAPI : public AbstractAPI {
9191
bool isEventCompleted(void* eventPtr) override;
9292
void recordEventOnHost(void* eventPtr) override;
9393
void recordEventOnStream(void* eventPtr, void* streamPtr) override;
94+
double timespanEvents(void* eventPtrStart, void* eventPtrEnd) override;
9495

9596
void initialize() override;
9697
void finalize() override;

interfaces/cuda/Events.cu

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ void* ConcreteAPI::createEvent(bool withTiming) {
2525
return static_cast<void*>(event);
2626
}
2727

28+
double ConcreteAPI::timespanEvents(void* eventPtrStart, void* eventPtrEnd) {
29+
float time{};
30+
cudaEvent_t start = reinterpret_cast<cudaEvent_t>(eventPtrStart);
31+
cudaEvent_t end = reinterpret_cast<cudaEvent_t>(eventPtrEnd);
32+
APIWRAP(cudaEventElapsedTime(&time, start, end));
33+
return static_cast<double>(time) / 1000.0;
34+
}
35+
2836
void ConcreteAPI::destroyEvent(void* eventPtr) {
2937
cudaEvent_t event = static_cast<cudaEvent_t>(eventPtr);
3038
APIWRAP(cudaEventDestroy(event));

interfaces/hip/Events.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ void* ConcreteAPI::createEvent(bool withTiming) {
2525
return static_cast<void*>(event);
2626
}
2727

28+
double ConcreteAPI::timespanEvents(void* eventPtrStart, void* eventPtrEnd) {
29+
float time{};
30+
hipEvent_t start = reinterpret_cast<hipEvent_t>(eventPtrStart);
31+
hipEvent_t end = reinterpret_cast<hipEvent_t>(eventPtrEnd);
32+
APIWRAP(hipEventElapsedTime(&time, start, end));
33+
return static_cast<double>(time) / 1000.0;
34+
}
35+
2836
void ConcreteAPI::destroyEvent(void* eventPtr) {
2937
hipEvent_t event = static_cast<hipEvent_t>(eventPtr);
3038
APIWRAP(hipEventDestroy(event));

interfaces/hip/HipWrappedAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class ConcreteAPI : public AbstractAPI {
9191
bool isEventCompleted(void* eventPtr) override;
9292
void recordEventOnHost(void* eventPtr) override;
9393
void recordEventOnStream(void* eventPtr, void* streamPtr) override;
94+
double timespanEvents(void* eventPtrStart, void* eventPtrEnd) override;
9495

9596
void initialize() override;
9697
void finalize() override;

interfaces/sycl/Events.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,22 @@ void* ConcreteAPI::createEvent(bool withTiming) {
2727
return new Event();
2828
}
2929

30+
double ConcreteAPI::timespanEvents(void* eventPtrStart, void* eventPtrEnd) {
31+
auto* start = static_cast<Event*>(eventPtrStart);
32+
auto* end = static_cast<Event*>(eventPtrEnd);
33+
34+
if (!(start->syclEvent.has_value() && end->syclEvent.has_value())) {
35+
logError() << "Invalid events given for timing calculation.";
36+
}
37+
38+
const auto startTime = start->syclEvent.value().get_profiling_info<sycl::info::event_profiling::command_end>();
39+
const auto endTime = end->syclEvent.value().get_profiling_info<sycl::info::event_profiling::command_end>();
40+
41+
// cf. https://oneapi-src.github.io/SYCLomatic/dev_guide/reference/diagnostic_ref/dpct1012.html
42+
43+
return static_cast<double>(endTime - startTime) / 1'000'000'000.0;
44+
}
45+
3046
void ConcreteAPI::destroyEvent(void* eventPtr) {
3147
auto* event = static_cast<Event*>(eventPtr);
3248
delete event;
@@ -63,6 +79,10 @@ void ConcreteAPI::syncStreamWithEvent(void* streamPtr, void* eventPtr) {
6379
auto* queue = static_cast<sycl::queue*>(streamPtr);
6480
auto* event = static_cast<Event*>(eventPtr);
6581

82+
if (!event->syclEvent.has_value()) {
83+
logError() << "Event not yet recorded; no synchronization possible.";
84+
}
85+
6686
queue->submit([&](sycl::handler& h) {
6787
DEVICE_SYCL_EMPTY_OPERATION_WITH_EVENT(h, event->syclEvent.value());
6888
});

interfaces/sycl/SyclWrappedAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class ConcreteAPI : public AbstractAPI {
125125
bool isEventCompleted(void* eventPtr) override;
126126
void recordEventOnHost(void* eventPtr) override;
127127
void recordEventOnStream(void* eventPtr, void* streamPtr) override;
128+
double timespanEvents(void* eventPtrStart, void* eventPtrEnd) override;
128129

129130
void initialize() override;
130131
void finalize() override;

0 commit comments

Comments
 (0)