aboutsummaryrefslogtreecommitdiff
path: root/compute_kernel_writer/src
diff options
context:
space:
mode:
authorGunes Bayir <gunes.bayir@arm.com>2023-07-11 14:57:36 +0100
committerGunes Bayir <gunes.bayir@arm.com>2023-07-12 10:09:19 +0000
commitab0b75054ca3ddd62cff34518f331aa8474daa5a (patch)
treebf23ec6a1baee5b7359af1b91fb4b3a462760e2f /compute_kernel_writer/src
parent653b96c9a72b2b6d4d82d6ee67b51be66351c617 (diff)
downloadComputeLibrary-ab0b75054ca3ddd62cff34518f331aa8474daa5a.tar.gz
Add tile declaration capability in KernelWriter
Resolves: COMPMID-5816 Signed-off-by: Gunes Bayir <gunes.bayir@arm.com> Change-Id: Ibd885707a842550a058252f9d01e072129896055 Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9901 Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Viet-Hoa Do <viet-hoa.do@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Benchmark: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'compute_kernel_writer/src')
-rw-r--r--compute_kernel_writer/src/Kernel.cpp3
-rw-r--r--compute_kernel_writer/src/KernelWriter.cpp25
-rw-r--r--compute_kernel_writer/src/cl/CLHelpers.cpp34
-rw-r--r--compute_kernel_writer/src/cl/CLHelpers.h14
-rw-r--r--compute_kernel_writer/src/cl/CLKernelWriter.cpp31
-rw-r--r--compute_kernel_writer/src/cl/CLKernelWriter.h10
6 files changed, 108 insertions, 9 deletions
diff --git a/compute_kernel_writer/src/Kernel.cpp b/compute_kernel_writer/src/Kernel.cpp
index ccc68ecefb..5eea1aa548 100644
--- a/compute_kernel_writer/src/Kernel.cpp
+++ b/compute_kernel_writer/src/Kernel.cpp
@@ -23,10 +23,13 @@
*/
#include "ckw/Kernel.h"
+#include "ckw/types/TargetLanguage.h"
namespace ckw
{
+Kernel::~Kernel() = default;
+
Kernel::Kernel(TargetLanguage language, const std::string &source_code)
: _language(language), _source_code(source_code)
{
diff --git a/compute_kernel_writer/src/KernelWriter.cpp b/compute_kernel_writer/src/KernelWriter.cpp
index eb8399a7ef..ab5ede8c77 100644
--- a/compute_kernel_writer/src/KernelWriter.cpp
+++ b/compute_kernel_writer/src/KernelWriter.cpp
@@ -22,15 +22,22 @@
* SOFTWARE.
*/
-#include "ckw/KernelWriter.h"
#include "ckw/Error.h"
+#include "ckw/ITileOperand.h"
+#include "ckw/KernelWriter.h"
+#include "ckw/types/TargetArchitecture.h"
+#include "ckw/types/TargetLanguage.h"
#include "src/cl/CLKernelWriter.h"
+#include <iterator>
namespace ckw
{
+KernelWriter::~KernelWriter() = default;
+
std::unique_ptr<KernelWriter> KernelWriter::create_instance(TargetArchitecture architecture, TargetLanguage language)
{
+ CKW_UNUSED(architecture);
switch(language)
{
case TargetLanguage::OpenCL:
@@ -43,6 +50,20 @@ std::unique_ptr<KernelWriter> KernelWriter::create_instance(TargetArchitecture a
}
}
-KernelWriter::~KernelWriter() = default;
+int32_t KernelWriter::id_space() const
+{
+ return _id_space;
+}
+
+ITileOperand &KernelWriter::add_operand(std::unique_ptr<ITileOperand> &operand_ptr)
+{
+ auto it = _operands.insert(std::move(operand_ptr));
+ return *it.first->get();
+}
+
+std::string KernelWriter::generate_full_name(const std::string &name) const
+{
+ return "G" + std::to_string(id_space()) + "__" + name;
+}
} // namespace ckw
diff --git a/compute_kernel_writer/src/cl/CLHelpers.cpp b/compute_kernel_writer/src/cl/CLHelpers.cpp
index d940a5a529..5a3d0fab81 100644
--- a/compute_kernel_writer/src/cl/CLHelpers.cpp
+++ b/compute_kernel_writer/src/cl/CLHelpers.cpp
@@ -88,4 +88,36 @@ std::string cl_get_variable_datatype_as_string(DataType dt, int32_t len)
return res;
}
-} // namespace ckw \ No newline at end of file
+
+int32_t width_to_cl_vector_size(int32_t width)
+{
+ switch(width)
+ {
+ case 1:
+ return 1;
+ case 2:
+ return 2;
+ case 3:
+ return 3;
+ case 4:
+ return 4;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ return 8;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ return 16;
+ default:
+ CKW_THROW_MSG("Unsupported width to convert to OpenCL vector");
+ return 0;
+ }
+}
+} // namespace ckw
diff --git a/compute_kernel_writer/src/cl/CLHelpers.h b/compute_kernel_writer/src/cl/CLHelpers.h
index 915d59f458..a9a84e2187 100644
--- a/compute_kernel_writer/src/cl/CLHelpers.h
+++ b/compute_kernel_writer/src/cl/CLHelpers.h
@@ -21,10 +21,11 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
-#ifndef COMPUTE_KERNEL_WRITER_SRC_CL_CLHELPERS_H
-#define COMPUTE_KERNEL_WRITER_SRC_CL_CLHELPERS_H
+#ifndef CKW_SRC_CL_CLHELPERS_H
+#define CKW_SRC_CL_CLHELPERS_H
#include <string>
+#include <cstdint>
/** OpenCL specific helper functions */
namespace ckw
@@ -48,6 +49,15 @@ bool cl_validate_vector_length(int32_t len);
* @return the OpenCL datatype as a string
*/
std::string cl_get_variable_datatype_as_string(DataType dt, int32_t len);
+
+/** Helper function to return the OpenCL vector size that accommodate the the desired width
+ *
+ * @param[in] width The desired width
+ *
+ * @return the OpenCL vector size
+*/
+int32_t width_to_cl_vector_size(int32_t width);
+
} // namespace ckw
#endif /* COMPUTE_KERNEL_WRITER_SRC_CL_CLHELPERS_H */
diff --git a/compute_kernel_writer/src/cl/CLKernelWriter.cpp b/compute_kernel_writer/src/cl/CLKernelWriter.cpp
index 231d321c22..7faf2e6d60 100644
--- a/compute_kernel_writer/src/cl/CLKernelWriter.cpp
+++ b/compute_kernel_writer/src/cl/CLKernelWriter.cpp
@@ -24,14 +24,14 @@
#include "src/cl/CLKernelWriter.h"
#include "ckw/Error.h"
+#include "src/cl/CLTile.h"
+#include "src/cl/CLHelpers.h"
+#include <cstdint>
namespace ckw
{
-CLKernelWriter::CLKernelWriter()
-{
-}
-
+CLKernelWriter::CLKernelWriter() = default;
CLKernelWriter::~CLKernelWriter() = default;
std::unique_ptr<Kernel> CLKernelWriter::emit_kernel(const std::string &name)
@@ -61,4 +61,27 @@ const std::string &CLKernelWriter::body_source_code() const
return _body_source_code;
}
+ITileOperand &CLKernelWriter::declare_tile(const std::string &name, const TileInfo &tile_info)
+{
+ const std::string fullname = generate_full_name(name);
+
+ const int32_t height = tile_info.height();
+ const int32_t width = tile_info.width();
+ const DataType data_type = tile_info.data_type();
+
+ for(int32_t row = 0; row < height; ++row)
+ {
+ const std::string cl_type = cl_get_variable_datatype_as_string(data_type, width);
+ append_code(cl_type, " ", fullname, std::to_string(row), ";\n");
+ }
+
+ return add_operand(fullname, tile_info);
+}
+
+ITileOperand &CLKernelWriter::add_operand(const std::string &name, const TileInfo &tile_info)
+{
+ std::unique_ptr<ITileOperand> operand = std::make_unique<CLTile>(name, tile_info);
+ return KernelWriter::add_operand(operand);
+}
+
} // namespace ckw
diff --git a/compute_kernel_writer/src/cl/CLKernelWriter.h b/compute_kernel_writer/src/cl/CLKernelWriter.h
index e6f0641538..d0c4b7c9d4 100644
--- a/compute_kernel_writer/src/cl/CLKernelWriter.h
+++ b/compute_kernel_writer/src/cl/CLKernelWriter.h
@@ -57,6 +57,13 @@ public:
std::unique_ptr<Kernel> emit_kernel(const std::string &name) override;
+ /** Declare a tile given name and tile information
+ *
+ * Similar to @ref KernelWriter::declare_tile()
+ */
+ ITileOperand &declare_tile(const ::std::string &name, const TileInfo &tile_info) override;
+
+
protected:
/** Append the specified code to the kernel body source code. */
template <typename T, typename... TArgs>
@@ -76,6 +83,9 @@ protected:
/** Get the current kernel body source code. */
const std::string &body_source_code() const;
+ /** Add a tile operand to the kernel and return it */
+ ITileOperand &add_operand(const std::string &code, const TileInfo &tile_info) override;
+
private:
/** This string contains the kernel body source code, not the full CL source code.
* The full source code will only be generated when the user calls @ref KernelWriter::emit_kernel.