summaryrefslogtreecommitdiff
path: root/src/routines/level3
diff options
context:
space:
mode:
Diffstat (limited to 'src/routines/level3')
-rw-r--r--src/routines/level3/xgemm.cc28
-rw-r--r--src/routines/level3/xhemm.cc8
-rw-r--r--src/routines/level3/xher2k.cc42
-rw-r--r--src/routines/level3/xherk.cc28
-rw-r--r--src/routines/level3/xsymm.cc8
-rw-r--r--src/routines/level3/xsyr2k.cc32
-rw-r--r--src/routines/level3/xsyrk.cc24
-rw-r--r--src/routines/level3/xtrmm.cc8
8 files changed, 139 insertions, 39 deletions
diff --git a/src/routines/level3/xgemm.cc b/src/routines/level3/xgemm.cc
index 5dc2ad7f..7557dcc3 100644
--- a/src/routines/level3/xgemm.cc
+++ b/src/routines/level3/xgemm.cc
@@ -29,7 +29,7 @@ template <> const Precision Xgemm<double2>::precision_ = Precision::kComplexDoub
// Constructor: forwards to base class constructor
template <typename T>
-Xgemm<T>::Xgemm(Queue &queue, Event &event, const std::string &name):
+Xgemm<T>::Xgemm(Queue &queue, EventPointer event, const std::string &name):
Routine<T>(queue, event, name, {"Copy","Pad","Transpose","Padtranspose","Xgemm"}, precision_) {
source_string_ =
#include "../../kernels/level3/copy.opencl"
@@ -122,30 +122,43 @@ StatusCode Xgemm<T>::DoGemm(const Layout layout,
auto b_temp = (b_no_temp) ? b_buffer : Buffer<T>(context_, k_ceiled*n_ceiled);
auto c_temp = (c_no_temp) ? c_buffer : Buffer<T>(context_, m_ceiled*n_ceiled);
+ // Events of all kernels (including pre/post processing kernels)
+ auto eventWaitList = std::vector<Event>();
+ auto emptyEventList = std::vector<Event>();
+
// Runs the pre-processing kernel for matrix A. This transposes the matrix, but also pads zeros
// to fill it up until it reaches a certain multiple of size (kernel parameter dependent). In
// case nothing has to be done, these kernels can be skipped.
if (!a_no_temp) {
- status = PadCopyTransposeMatrix(a_one, a_two, a_ld, a_offset, a_buffer,
+ auto eventProcessA = Event();
+ status = PadCopyTransposeMatrix(eventProcessA.pointer(), emptyEventList,
+ a_one, a_two, a_ld, a_offset, a_buffer,
m_ceiled, k_ceiled, m_ceiled, 0, a_temp,
program, true, a_do_transpose, a_conjugate);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessA);
}
// As above, but now for matrix B
if (!b_no_temp) {
- status = PadCopyTransposeMatrix(b_one, b_two, b_ld, b_offset, b_buffer,
+ auto eventProcessB = Event();
+ status = PadCopyTransposeMatrix(eventProcessB.pointer(), emptyEventList,
+ b_one, b_two, b_ld, b_offset, b_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, b_temp,
program, true, b_do_transpose, b_conjugate);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessB);
}
// As above, but now for matrix C. This is only necessary if C is used both as input and output.
if (!c_no_temp && beta != static_cast<T>(0)) {
- status = PadCopyTransposeMatrix(c_one, c_two, c_ld, c_offset, c_buffer,
+ auto eventProcessC = Event();
+ status = PadCopyTransposeMatrix(eventProcessC.pointer(), emptyEventList,
+ c_one, c_two, c_ld, c_offset, c_buffer,
m_ceiled, n_ceiled, m_ceiled, 0, c_temp,
program, true, c_do_transpose, false);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessC);
}
// Retrieves the Xgemm kernel from the compiled binary
@@ -170,12 +183,15 @@ StatusCode Xgemm<T>::DoGemm(const Layout layout,
auto local = std::vector<size_t>{db_["MDIMC"], db_["NDIMC"]};
// Launches the kernel
- status = RunKernel(kernel, global, local);
+ auto eventKernel = Event();
+ status = RunKernel(kernel, global, local, eventKernel.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel);
// Runs the post-processing kernel if needed
if (!c_no_temp) {
- status = PadCopyTransposeMatrix(m_ceiled, n_ceiled, m_ceiled, 0, c_temp,
+ status = PadCopyTransposeMatrix(event_, eventWaitList,
+ m_ceiled, n_ceiled, m_ceiled, 0, c_temp,
c_one, c_two, c_ld, c_offset, c_buffer,
program, false, c_do_transpose, false);
if (ErrorIn(status)) { return status; }
diff --git a/src/routines/level3/xhemm.cc b/src/routines/level3/xhemm.cc
index bcc60dee..c0a4306a 100644
--- a/src/routines/level3/xhemm.cc
+++ b/src/routines/level3/xhemm.cc
@@ -21,7 +21,7 @@ namespace clblast {
// Constructor: forwards to base class constructor
template <typename T>
-Xhemm<T>::Xhemm(Queue &queue, Event &event, const std::string &name):
+Xhemm<T>::Xhemm(Queue &queue, EventPointer event, const std::string &name):
Xgemm<T>(queue, event, name) {
}
@@ -79,9 +79,13 @@ StatusCode Xhemm<T>::DoHemm(const Layout layout, const Side side, const Triangle
auto global = std::vector<size_t>{Ceil(CeilDiv(k, db_["PAD_WPTX"]), db_["PAD_DIMX"]),
Ceil(CeilDiv(k, db_["PAD_WPTY"]), db_["PAD_DIMY"])};
auto local = std::vector<size_t>{db_["PAD_DIMX"], db_["PAD_DIMY"]};
- status = RunKernel(kernel, global, local);
+ auto kernelEvent = Event();
+ status = RunKernel(kernel, global, local, kernelEvent.pointer());
if (ErrorIn(status)) { return status; }
+ // Synchronize now: 'DoGemm' does not accept a list of events to wait for
+ kernelEvent.WaitForCompletion();
+
// Runs the regular Xgemm code with either "C := AB+C" or ...
if (side == Side::kLeft) {
status = DoGemm(layout, Transpose::kNo, Transpose::kNo,
diff --git a/src/routines/level3/xher2k.cc b/src/routines/level3/xher2k.cc
index 1711905d..4d5a4d35 100644
--- a/src/routines/level3/xher2k.cc
+++ b/src/routines/level3/xher2k.cc
@@ -27,7 +27,7 @@ template <> const Precision Xher2k<double2,double>::precision_ = Precision::kCom
// Constructor: forwards to base class constructor
template <typename T, typename U>
-Xher2k<T,U>::Xher2k(Queue &queue, Event &event, const std::string &name):
+Xher2k<T,U>::Xher2k(Queue &queue, EventPointer event, const std::string &name):
Routine<T>(queue, event, name, {"Copy","Pad","Transpose","Padtranspose","Xgemm"}, precision_) {
source_string_ =
#include "../../kernels/level3/copy.opencl"
@@ -112,39 +112,58 @@ StatusCode Xher2k<T,U>::DoHer2k(const Layout layout, const Triangle triangle, co
auto b2_temp = (b2_no_temp) ? b_buffer : Buffer<T>(context_, k_ceiled*n_ceiled);
auto c_temp = Buffer<T>(context_, n_ceiled*n_ceiled);
+ // Events of all kernels (including pre/post processing kernels)
+ auto eventWaitList = std::vector<Event>();
+ auto emptyEventList = std::vector<Event>();
+
// Runs the pre-processing kernels. This transposes the matrices A and B, but also pads zeros to
// to fill it up until it reaches a certain multiple of size (kernel parameter dependent). In
// case nothing has to be done, these kernels can be skipped.
if (!a1_no_temp) {
- status = PadCopyTransposeMatrix(ab_one, ab_two, a_ld, a_offset, a_buffer,
+ auto eventProcessA1 = Event();
+ status = PadCopyTransposeMatrix(eventProcessA1.pointer(), emptyEventList,
+ ab_one, ab_two, a_ld, a_offset, a_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, a1_temp,
program, true, ab_rotated, ab_conjugate);
+ eventWaitList.push_back(eventProcessA1);
if (ErrorIn(status)) { return status; }
}
if (!a2_no_temp) {
- status = PadCopyTransposeMatrix(ab_one, ab_two, a_ld, a_offset, a_buffer,
+ auto eventProcessA2 = Event();
+ status = PadCopyTransposeMatrix(eventProcessA2.pointer(), emptyEventList,
+ ab_one, ab_two, a_ld, a_offset, a_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, a2_temp,
program, true, ab_rotated, !ab_conjugate);
+ eventWaitList.push_back(eventProcessA2);
if (ErrorIn(status)) { return status; }
}
if (!b1_no_temp) {
- status = PadCopyTransposeMatrix(ab_one, ab_two, b_ld, b_offset, b_buffer,
+ auto eventProcessB1 = Event();
+ status = PadCopyTransposeMatrix(eventProcessB1.pointer(), emptyEventList,
+ ab_one, ab_two, b_ld, b_offset, b_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, b1_temp,
program, true, ab_rotated, ab_conjugate);
+ eventWaitList.push_back(eventProcessB1);
if (ErrorIn(status)) { return status; }
}
if (!b2_no_temp) {
- status = PadCopyTransposeMatrix(ab_one, ab_two, b_ld, b_offset, b_buffer,
+ auto eventProcessB2 = Event();
+ status = PadCopyTransposeMatrix(eventProcessB2.pointer(), emptyEventList,
+ ab_one, ab_two, b_ld, b_offset, b_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, b2_temp,
program, true, ab_rotated, !ab_conjugate);
+ eventWaitList.push_back(eventProcessB2);
if (ErrorIn(status)) { return status; }
}
// Furthermore, also creates a (possibly padded) copy of matrix C, since it is not allowed to
// modify the other triangle.
- status = PadCopyTransposeMatrix(n, n, c_ld, c_offset, c_buffer,
+ auto eventProcessC = Event();
+ status = PadCopyTransposeMatrix(eventProcessC.pointer(), emptyEventList,
+ n, n, c_ld, c_offset, c_buffer,
n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
program, true, c_rotated, false);
+ eventWaitList.push_back(eventProcessC);
if (ErrorIn(status)) { return status; }
// Retrieves the XgemmUpper or XgemmLower kernel from the compiled binary
@@ -169,8 +188,10 @@ StatusCode Xher2k<T,U>::DoHer2k(const Layout layout, const Triangle triangle, co
auto local = std::vector<size_t>{db_["MDIMC"], db_["NDIMC"]};
// Launches the kernel
- status = RunKernel(kernel, global, local);
+ auto eventKernel1 = Event();
+ status = RunKernel(kernel, global, local, eventKernel1.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel1);
// Swaps the arguments for matrices A and B, sets 'beta' to 1, and conjugate alpha
auto conjugate_alpha = T{alpha.real(), -alpha.imag()};
@@ -181,13 +202,16 @@ StatusCode Xher2k<T,U>::DoHer2k(const Layout layout, const Triangle triangle, co
kernel.SetArgument(5, a2_temp());
// Runs the kernel again
- status = RunKernel(kernel, global, local);
+ auto eventKernel2 = Event();
+ status = RunKernel(kernel, global, local, eventKernel2.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel2);
// Runs the post-processing kernel
auto upper = (triangle == Triangle::kUpper);
auto lower = (triangle == Triangle::kLower);
- status = PadCopyTransposeMatrix(n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
+ status = PadCopyTransposeMatrix(event_, eventWaitList,
+ n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
n, n, c_ld, c_offset, c_buffer,
program, false, c_rotated, false, upper, lower, true);
if (ErrorIn(status)) { return status; }
diff --git a/src/routines/level3/xherk.cc b/src/routines/level3/xherk.cc
index cbd0a188..574debe4 100644
--- a/src/routines/level3/xherk.cc
+++ b/src/routines/level3/xherk.cc
@@ -27,7 +27,7 @@ template <> const Precision Xherk<double2,double>::precision_ = Precision::kComp
// Constructor: forwards to base class constructor
template <typename T, typename U>
-Xherk<T,U>::Xherk(Queue &queue, Event &event, const std::string &name):
+Xherk<T,U>::Xherk(Queue &queue, EventPointer event, const std::string &name):
Routine<T>(queue, event, name, {"Copy","Pad","Transpose","Padtranspose","Xgemm"}, precision_) {
source_string_ =
#include "../../kernels/level3/copy.opencl"
@@ -103,27 +103,40 @@ StatusCode Xherk<T,U>::DoHerk(const Layout layout, const Triangle triangle, cons
auto b_temp = (b_no_temp) ? a_buffer : Buffer<T>(context_, k_ceiled*n_ceiled);
auto c_temp = Buffer<T>(context_, n_ceiled*n_ceiled);
+ // Events of all kernels (including pre/post processing kernels)
+ auto eventWaitList = std::vector<Event>();
+ auto emptyEventList = std::vector<Event>();
+
// Runs the pre-processing kernel for matrix A. This transposes the matrix, but also pads zeros
// to fill it up until it reaches a certain multiple of size (kernel parameter dependent). In
// case nothing has to be done, these kernels can be skipped. Two copies are created.
if (!a_no_temp) {
- status = PadCopyTransposeMatrix(a_one, a_two, a_ld, a_offset, a_buffer,
+ auto eventProcessA = Event();
+ status = PadCopyTransposeMatrix(eventProcessA.pointer(), emptyEventList,
+ a_one, a_two, a_ld, a_offset, a_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, a_temp,
program, true, a_rotated, a_conjugate);
+ eventWaitList.push_back(eventProcessA);
if (ErrorIn(status)) { return status; }
}
if (!b_no_temp) {
- status = PadCopyTransposeMatrix(a_one, a_two, a_ld, a_offset, a_buffer,
+ auto eventProcessB = Event();
+ status = PadCopyTransposeMatrix(eventProcessB.pointer(), emptyEventList,
+ a_one, a_two, a_ld, a_offset, a_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, b_temp,
program, true, a_rotated, b_conjugate);
+ eventWaitList.push_back(eventProcessB);
if (ErrorIn(status)) { return status; }
}
// Furthermore, also creates a (possibly padded) copy of matrix C, since it is not allowed to
// modify the other triangle.
- status = PadCopyTransposeMatrix(n, n, c_ld, c_offset, c_buffer,
+ auto eventProcessC = Event();
+ status = PadCopyTransposeMatrix(eventProcessC.pointer(), emptyEventList,
+ n, n, c_ld, c_offset, c_buffer,
n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
program, true, c_rotated, false);
+ eventWaitList.push_back(eventProcessC);
if (ErrorIn(status)) { return status; }
// Retrieves the XgemmUpper or XgemmLower kernel from the compiled binary
@@ -149,13 +162,16 @@ StatusCode Xherk<T,U>::DoHerk(const Layout layout, const Triangle triangle, cons
auto local = std::vector<size_t>{db_["MDIMC"], db_["NDIMC"]};
// Launches the kernel
- status = RunKernel(kernel, global, local);
+ auto eventKernel = Event();
+ status = RunKernel(kernel, global, local, eventKernel.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel);
// Runs the post-processing kernel
auto upper = (triangle == Triangle::kUpper);
auto lower = (triangle == Triangle::kLower);
- status = PadCopyTransposeMatrix(n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
+ status = PadCopyTransposeMatrix(event_, eventWaitList,
+ n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
n, n, c_ld, c_offset, c_buffer,
program, false, c_rotated, false, upper, lower, true);
if (ErrorIn(status)) { return status; }
diff --git a/src/routines/level3/xsymm.cc b/src/routines/level3/xsymm.cc
index 583d5c7d..914a326a 100644
--- a/src/routines/level3/xsymm.cc
+++ b/src/routines/level3/xsymm.cc
@@ -21,7 +21,7 @@ namespace clblast {
// Constructor: forwards to base class constructor
template <typename T>
-Xsymm<T>::Xsymm(Queue &queue, Event &event, const std::string &name):
+Xsymm<T>::Xsymm(Queue &queue, EventPointer event, const std::string &name):
Xgemm<T>(queue, event, name) {
}
@@ -79,9 +79,13 @@ StatusCode Xsymm<T>::DoSymm(const Layout layout, const Side side, const Triangle
auto global = std::vector<size_t>{Ceil(CeilDiv(k, db_["PAD_WPTX"]), db_["PAD_DIMX"]),
Ceil(CeilDiv(k, db_["PAD_WPTY"]), db_["PAD_DIMY"])};
auto local = std::vector<size_t>{db_["PAD_DIMX"], db_["PAD_DIMY"]};
- status = RunKernel(kernel, global, local);
+ auto kernelEvent = Event();
+ status = RunKernel(kernel, global, local, kernelEvent.pointer());
if (ErrorIn(status)) { return status; }
+ // Synchronize now: 'DoGemm' does not accept a list of events to wait for
+ kernelEvent.WaitForCompletion();
+
// Runs the regular Xgemm code with either "C := AB+C" or ...
if (side == Side::kLeft) {
status = DoGemm(layout, Transpose::kNo, Transpose::kNo,
diff --git a/src/routines/level3/xsyr2k.cc b/src/routines/level3/xsyr2k.cc
index 79090871..44d0024e 100644
--- a/src/routines/level3/xsyr2k.cc
+++ b/src/routines/level3/xsyr2k.cc
@@ -29,7 +29,7 @@ template <> const Precision Xsyr2k<double2>::precision_ = Precision::kComplexDou
// Constructor: forwards to base class constructor
template <typename T>
-Xsyr2k<T>::Xsyr2k(Queue &queue, Event &event, const std::string &name):
+Xsyr2k<T>::Xsyr2k(Queue &queue, EventPointer event, const std::string &name):
Routine<T>(queue, event, name, {"Copy","Pad","Transpose","Padtranspose","Xgemm"}, precision_) {
source_string_ =
#include "../../kernels/level3/copy.opencl"
@@ -104,28 +104,41 @@ StatusCode Xsyr2k<T>::DoSyr2k(const Layout layout, const Triangle triangle, cons
auto b_temp = (b_no_temp) ? b_buffer : Buffer<T>(context_, k_ceiled*n_ceiled);
auto c_temp = Buffer<T>(context_, n_ceiled*n_ceiled);
+ // Events of all kernels (including pre/post processing kernels)
+ auto eventWaitList = std::vector<Event>();
+ auto emptyEventList = std::vector<Event>();
+
// Runs the pre-processing kernels. This transposes the matrices A and B, but also pads zeros to
// to fill it up until it reaches a certain multiple of size (kernel parameter dependent). In
// case nothing has to be done, these kernels can be skipped.
if (!a_no_temp) {
- status = PadCopyTransposeMatrix(ab_one, ab_two, a_ld, a_offset, a_buffer,
+ auto eventProcessA = Event();
+ status = PadCopyTransposeMatrix(eventProcessA.pointer(), emptyEventList,
+ ab_one, ab_two, a_ld, a_offset, a_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, a_temp,
program, true, ab_rotated, false);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessA);
}
if (!b_no_temp) {
- status = PadCopyTransposeMatrix(ab_one, ab_two, b_ld, b_offset, b_buffer,
+ auto eventProcessB = Event();
+ status = PadCopyTransposeMatrix(eventProcessB.pointer(), emptyEventList,
+ ab_one, ab_two, b_ld, b_offset, b_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, b_temp,
program, true, ab_rotated, false);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessB);
}
// Furthermore, also creates a (possibly padded) copy of matrix C, since it is not allowed to
// modify the other triangle.
- status = PadCopyTransposeMatrix(n, n, c_ld, c_offset, c_buffer,
+ auto eventProcessC = Event();
+ status = PadCopyTransposeMatrix(eventProcessC.pointer(), emptyEventList,
+ n, n, c_ld, c_offset, c_buffer,
n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
program, true, c_rotated, false);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessC);
// Retrieves the XgemmUpper or XgemmLower kernel from the compiled binary
try {
@@ -148,8 +161,10 @@ StatusCode Xsyr2k<T>::DoSyr2k(const Layout layout, const Triangle triangle, cons
auto local = std::vector<size_t>{db_["MDIMC"], db_["NDIMC"]};
// Launches the kernel
- status = RunKernel(kernel, global, local);
+ auto eventKernel1 = Event();
+ status = RunKernel(kernel, global, local, eventKernel1.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel1);
// Swaps the arguments for matrices A and B, and sets 'beta' to 1
auto one = static_cast<T>(1);
@@ -158,13 +173,16 @@ StatusCode Xsyr2k<T>::DoSyr2k(const Layout layout, const Triangle triangle, cons
kernel.SetArgument(5, a_temp());
// Runs the kernel again
- status = RunKernel(kernel, global, local);
+ auto eventKernel2 = Event();
+ status = RunKernel(kernel, global, local, eventKernel2.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel2);
// Runs the post-processing kernel
auto upper = (triangle == Triangle::kUpper);
auto lower = (triangle == Triangle::kLower);
- status = PadCopyTransposeMatrix(n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
+ status = PadCopyTransposeMatrix(event_, eventWaitList,
+ n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
n, n, c_ld, c_offset, c_buffer,
program, false, c_rotated, false, upper, lower, false);
if (ErrorIn(status)) { return status; }
diff --git a/src/routines/level3/xsyrk.cc b/src/routines/level3/xsyrk.cc
index ca429bd7..44ed8d35 100644
--- a/src/routines/level3/xsyrk.cc
+++ b/src/routines/level3/xsyrk.cc
@@ -29,7 +29,7 @@ template <> const Precision Xsyrk<double2>::precision_ = Precision::kComplexDoub
// Constructor: forwards to base class constructor
template <typename T>
-Xsyrk<T>::Xsyrk(Queue &queue, Event &event, const std::string &name):
+Xsyrk<T>::Xsyrk(Queue &queue, EventPointer event, const std::string &name):
Routine<T>(queue, event, name, {"Copy","Pad","Transpose","Padtranspose","Xgemm"}, precision_) {
source_string_ =
#include "../../kernels/level3/copy.opencl"
@@ -97,22 +97,32 @@ StatusCode Xsyrk<T>::DoSyrk(const Layout layout, const Triangle triangle, const
auto a_temp = (a_no_temp) ? a_buffer : Buffer<T>(context_, k_ceiled*n_ceiled);
auto c_temp = Buffer<T>(context_, n_ceiled*n_ceiled);
+ // Events of all kernels (including pre/post processing kernels)
+ auto eventWaitList = std::vector<Event>();
+ auto emptyEventList = std::vector<Event>();
+
// Runs the pre-processing kernel for matrix A. This transposes the matrix, but also pads zeros
// to fill it up until it reaches a certain multiple of size (kernel parameter dependent). In
// case nothing has to be done, these kernels can be skipped.
if (!a_no_temp) {
- status = PadCopyTransposeMatrix(a_one, a_two, a_ld, a_offset, a_buffer,
+ auto eventProcessA = Event();
+ status = PadCopyTransposeMatrix(eventProcessA.pointer(), emptyEventList,
+ a_one, a_two, a_ld, a_offset, a_buffer,
n_ceiled, k_ceiled, n_ceiled, 0, a_temp,
program, true, a_rotated, false);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessA);
}
// Furthermore, also creates a (possibly padded) copy of matrix C, since it is not allowed to
// modify the other triangle.
- status = PadCopyTransposeMatrix(n, n, c_ld, c_offset, c_buffer,
+ auto eventProcessC = Event();
+ status = PadCopyTransposeMatrix(eventProcessC.pointer(), emptyEventList,
+ n, n, c_ld, c_offset, c_buffer,
n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
program, true, c_rotated, false);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventProcessC);
// Retrieves the XgemmUpper or XgemmLower kernel from the compiled binary
try {
@@ -135,17 +145,21 @@ StatusCode Xsyrk<T>::DoSyrk(const Layout layout, const Triangle triangle, const
auto local = std::vector<size_t>{db_["MDIMC"], db_["NDIMC"]};
// Launches the kernel
- status = RunKernel(kernel, global, local);
+ auto eventKernel = Event();
+ status = RunKernel(kernel, global, local, eventKernel.pointer(), eventWaitList);
if (ErrorIn(status)) { return status; }
+ eventWaitList.push_back(eventKernel);
// Runs the post-processing kernel
auto upper = (triangle == Triangle::kUpper);
auto lower = (triangle == Triangle::kLower);
- status = PadCopyTransposeMatrix(n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
+ status = PadCopyTransposeMatrix(event_, eventWaitList,
+ n_ceiled, n_ceiled, n_ceiled, 0, c_temp,
n, n, c_ld, c_offset, c_buffer,
program, false, c_rotated, false, upper, lower, false);
if (ErrorIn(status)) { return status; }
+
// Successfully finished the computation
return StatusCode::kSuccess;
} catch (...) { return StatusCode::kInvalidKernel; }
diff --git a/src/routines/level3/xtrmm.cc b/src/routines/level3/xtrmm.cc
index 1180c026..484cf040 100644
--- a/src/routines/level3/xtrmm.cc
+++ b/src/routines/level3/xtrmm.cc
@@ -21,7 +21,7 @@ namespace clblast {
// Constructor: forwards to base class constructor
template <typename T>
-Xtrmm<T>::Xtrmm(Queue &queue, Event &event, const std::string &name):
+Xtrmm<T>::Xtrmm(Queue &queue, EventPointer event, const std::string &name):
Xgemm<T>(queue, event, name) {
}
@@ -82,9 +82,13 @@ StatusCode Xtrmm<T>::DoTrmm(const Layout layout, const Side side, const Triangle
auto global = std::vector<size_t>{Ceil(CeilDiv(k, db_["PAD_WPTX"]), db_["PAD_DIMX"]),
Ceil(CeilDiv(k, db_["PAD_WPTY"]), db_["PAD_DIMY"])};
auto local = std::vector<size_t>{db_["PAD_DIMX"], db_["PAD_DIMY"]};
- status = RunKernel(kernel, global, local);
+ auto kernelEvent = Event();
+ status = RunKernel(kernel, global, local, kernelEvent.pointer());
if (ErrorIn(status)) { return status; }
+ // Synchronize now: 'DoGemm' does not accept a list of events to wait for
+ kernelEvent.WaitForCompletion();
+
// Runs the regular Xgemm code with either "B := alpha*A*B" or ...
if (side == Side::kLeft) {
status = DoGemm(layout, a_transpose, Transpose::kNo,