diff options
author | Gunes Bayir <gunes.bayir@arm.com> | 2023-07-11 14:57:36 +0100 |
---|---|---|
committer | Gunes Bayir <gunes.bayir@arm.com> | 2023-07-12 10:09:19 +0000 |
commit | ab0b75054ca3ddd62cff34518f331aa8474daa5a (patch) | |
tree | bf23ec6a1baee5b7359af1b91fb4b3a462760e2f /compute_kernel_writer/src | |
parent | 653b96c9a72b2b6d4d82d6ee67b51be66351c617 (diff) | |
download | ComputeLibrary-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.cpp | 3 | ||||
-rw-r--r-- | compute_kernel_writer/src/KernelWriter.cpp | 25 | ||||
-rw-r--r-- | compute_kernel_writer/src/cl/CLHelpers.cpp | 34 | ||||
-rw-r--r-- | compute_kernel_writer/src/cl/CLHelpers.h | 14 | ||||
-rw-r--r-- | compute_kernel_writer/src/cl/CLKernelWriter.cpp | 31 | ||||
-rw-r--r-- | compute_kernel_writer/src/cl/CLKernelWriter.h | 10 |
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. |