From 9a696a9a1d4a2f052d6bcdb8202daaa8c488bfae Mon Sep 17 00:00:00 2001 From: StRigaud Date: Thu, 24 Nov 2022 15:43:19 +0000 Subject: [PATCH 1/7] ADD: Custom kernel class --- clic/include/tier1/cleCustomKernel.hpp | 39 ++++++++++++++++++++++++++ clic/src/tier1/cleCustomKernel.cpp | 38 +++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 clic/include/tier1/cleCustomKernel.hpp create mode 100644 clic/src/tier1/cleCustomKernel.cpp diff --git a/clic/include/tier1/cleCustomKernel.hpp b/clic/include/tier1/cleCustomKernel.hpp new file mode 100644 index 000000000..c2cc5b0ae --- /dev/null +++ b/clic/include/tier1/cleCustomKernel.hpp @@ -0,0 +1,39 @@ +#ifndef __TIER1_CLECUSTOMKERNEL_HPP +#define __TIER1_CLECUSTOMKERNEL_HPP + +#include "cleOperation.hpp" + +namespace cle +{ + +class CustomKernel : public Operation +{ +public: + explicit CustomKernel(const ProcessorPointer & device, + const std::string & filename, + const std::string & name, + const size_t & nb_parameters); + + auto + AddImages(const std::map & images) -> void; + + auto + AddScalars(const std::map & scalars) -> void; +}; + +inline auto +CustomKernel_Call(const std::shared_ptr & device, + const std::string & filename, + const std::string & name, + const std::map & images, + const std::map & scalars) -> void +{ + CustomKernel kernel(device, filename, name, images.size() + scalars.size()); + kernel.AddImages(images); + kernel.AddScalars(images); + kernel.Execute(); +} + +} // namespace cle + +#endif // __TIER1_CLECUSTOMKERNEL_HPP diff --git a/clic/src/tier1/cleCustomKernel.cpp b/clic/src/tier1/cleCustomKernel.cpp new file mode 100644 index 000000000..a4daa19af --- /dev/null +++ b/clic/src/tier1/cleCustomKernel.cpp @@ -0,0 +1,38 @@ +#include "cleCustomKernel.hpp" + +#include +#include + +namespace cle +{ + +CustomKernel::CustomKernel(const ProcessorPointer & device, + const std::string & filename, + const std::string & name, + const size_t & nb_parameters) + : Operation(device, nb_parameters) +{ + std::ifstream ifs(filename); + std::string ocl_source((std::istreambuf_iterator(ifs)), (std::istreambuf_iterator())); + this->SetSource(name, ocl_source); +} + +auto +CustomKernel::AddImages(const std::map & images) -> void +{ + for (auto ite = images.begin(); ite != images.end(); ite++) + { + kernel.AddParameter(ite->first, ite->second); + } +} + +auto +CustomKernel::AddScalars(const std::map & scalars) -> void +{ + for (auto ite = scalars.begin(); ite != scalars.end(); ite++) + { + kernel.AddParameter(ite->first, ite->second); + } +} + +} // namespace cle From f169543258adb4dcef4eda55c586d4d32b0d5366 Mon Sep 17 00:00:00 2001 From: StRigaud Date: Thu, 24 Nov 2022 16:00:40 +0000 Subject: [PATCH 2/7] FIX: small typo and bug --- clic/include/tier1/cleCustomKernel.hpp | 2 +- clic/src/tier1/cleCustomKernel.cpp | 4 +- tests/CMakeLists.txt | 8 ++ tests/custom_kernel_test.cpp | 159 +++++++++++++++++++++++++ 4 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 tests/custom_kernel_test.cpp diff --git a/clic/include/tier1/cleCustomKernel.hpp b/clic/include/tier1/cleCustomKernel.hpp index c2cc5b0ae..979830972 100644 --- a/clic/include/tier1/cleCustomKernel.hpp +++ b/clic/include/tier1/cleCustomKernel.hpp @@ -30,7 +30,7 @@ CustomKernel_Call(const std::shared_ptr & device, { CustomKernel kernel(device, filename, name, images.size() + scalars.size()); kernel.AddImages(images); - kernel.AddScalars(images); + kernel.AddScalars(scalars); kernel.Execute(); } diff --git a/clic/src/tier1/cleCustomKernel.cpp b/clic/src/tier1/cleCustomKernel.cpp index a4daa19af..b1a63b2b8 100644 --- a/clic/src/tier1/cleCustomKernel.cpp +++ b/clic/src/tier1/cleCustomKernel.cpp @@ -22,7 +22,7 @@ CustomKernel::AddImages(const std::map & images) -> void { for (auto ite = images.begin(); ite != images.end(); ite++) { - kernel.AddParameter(ite->first, ite->second); + this->AddParameter(ite->first, ite->second); } } @@ -31,7 +31,7 @@ CustomKernel::AddScalars(const std::map & scalars) -> void { for (auto ite = scalars.begin(); ite != scalars.end(); ite++) { - kernel.AddParameter(ite->first, ite->second); + this->AddParameter(ite->first, ite->second); } } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 13214d7ae..f82ccc606 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -64,6 +64,12 @@ target_link_libraries(binary_or_test PRIVATE CLIc::CLIc) set_target_properties(binary_or_test PROPERTIES FOLDER "Tests") target_compile_features(binary_or_test PRIVATE cxx_std_17) +add_executable(custom_kernel_test custom_kernel_test.cpp) +add_dependencies(custom_kernel_test CLIc) +target_link_libraries(custom_kernel_test PRIVATE CLIc::CLIc) +set_target_properties(custom_kernel_test PROPERTIES FOLDER "Tests") +target_compile_features(custom_kernel_test PRIVATE cxx_std_17) + add_executable(binary_subtract_test binary_subtract_test.cpp) add_dependencies(binary_subtract_test CLIc) target_link_libraries(binary_subtract_test PRIVATE CLIc::CLIc) @@ -405,6 +411,7 @@ add_test(NAME core_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COM add_test(NAME core_buffer_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_buffer_test) add_test(NAME core_image_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_image_test) add_test(NAME core_kernel_test_buffer WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test buffer) +add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test) # add_test(NAME core_kernel_test_image WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test image) add_test(NAME absolute_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND absolute_test) add_test(NAME add_image_and_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND add_image_and_scalar_test) @@ -534,6 +541,7 @@ set_tests_properties(absolute_test smaller_or_equal_test smaller_test sobel_test + custom_kernel_test sum_all_pixels_test sum_reduction_x_test sum_x_projection_test diff --git a/tests/custom_kernel_test.cpp b/tests/custom_kernel_test.cpp new file mode 100644 index 000000000..42aa9269c --- /dev/null +++ b/tests/custom_kernel_test.cpp @@ -0,0 +1,159 @@ + + +#include + +#include "cleCustomKernel.hpp" +#include "clesperanto.hpp" + +template +auto +run_test(const std::array & shape, const cle::MemoryType & mem_type) -> bool +{ + type value = static_cast(rand() % 10); + std::vector input(shape[0] * shape[1] * shape[2]); + std::vector valid(shape[0] * shape[1] * shape[2]); + std::fill(input.begin(), input.end(), -value); + std::fill(valid.begin(), valid.end(), value); + + cle::Clesperanto cle; + cle.GetDevice()->WaitForKernelToFinish(); + + auto gpu_input = cle.Push(input, shape, mem_type); + auto gpu_output = cle.Create(shape, mem_type); + + cle::CustomKernel_Call(cle.GetDevice(), + "./thirdparty/clesperanot-kernels/kernels/absolute.cl", + "absolute", + { { "src", gpu_input }, { "dst", gpu_output } }, + {}); + + auto output = cle.Pull(gpu_output); + + return std::equal(output.begin(), output.end(), valid.begin()); +} + +auto +main(int argc, char ** argv) -> int +{ + if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + { + return EXIT_FAILURE; + } + + // if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::BUFFER)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 1, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 1 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + // if (!run_test({ 10, 5, 3 }, cle::IMAGE)) + // { + // return EXIT_FAILURE; + // } + + return EXIT_SUCCESS; +} \ No newline at end of file From 5a8ef77e990694dd5f0913f1a6b7c7261b3ec2e4 Mon Sep 17 00:00:00 2001 From: StRigaud Date: Fri, 25 Nov 2022 20:39:58 +0000 Subject: [PATCH 3/7] FIX: path to kernel source --- tests/CMakeLists.txt | 2 +- tests/custom_kernel_test.cpp | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f82ccc606..27a952033 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -411,7 +411,7 @@ add_test(NAME core_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COM add_test(NAME core_buffer_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_buffer_test) add_test(NAME core_image_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_image_test) add_test(NAME core_kernel_test_buffer WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test buffer) -add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test) +add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test "../../thirdparty/clesperanto-kernels/kernels/absolute.cl") # add_test(NAME core_kernel_test_image WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test image) add_test(NAME absolute_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND absolute_test) add_test(NAME add_image_and_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND add_image_and_scalar_test) diff --git a/tests/custom_kernel_test.cpp b/tests/custom_kernel_test.cpp index 42aa9269c..5c439e30d 100644 --- a/tests/custom_kernel_test.cpp +++ b/tests/custom_kernel_test.cpp @@ -7,7 +7,7 @@ template auto -run_test(const std::array & shape, const cle::MemoryType & mem_type) -> bool +run_test(const std::array & shape, const cle::MemoryType & mem_type, const std::string & path) -> bool { type value = static_cast(rand() % 10); std::vector input(shape[0] * shape[1] * shape[2]); @@ -21,11 +21,7 @@ run_test(const std::array & shape, const cle::MemoryType & mem_type) auto gpu_input = cle.Push(input, shape, mem_type); auto gpu_output = cle.Create(shape, mem_type); - cle::CustomKernel_Call(cle.GetDevice(), - "./thirdparty/clesperanot-kernels/kernels/absolute.cl", - "absolute", - { { "src", gpu_input }, { "dst", gpu_output } }, - {}); + cle::CustomKernel_Call(cle.GetDevice(), path, "absolute", { { "src", gpu_input }, { "dst", gpu_output } }, {}); auto output = cle.Pull(gpu_output); @@ -35,7 +31,7 @@ run_test(const std::array & shape, const cle::MemoryType & mem_type) auto main(int argc, char ** argv) -> int { - if (!run_test({ 10, 1, 1 }, cle::BUFFER)) + if (!run_test({ 10, 1, 1 }, cle::BUFFER, argv[1])) { return EXIT_FAILURE; } From ecc1f43d9f25dae521479681ad415fe160de2bf8 Mon Sep 17 00:00:00 2001 From: Stephane Rigaud Date: Mon, 28 Nov 2022 14:40:12 +0100 Subject: [PATCH 4/7] ADD: error message if file is not found --- clic/src/tier1/cleCustomKernel.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/clic/src/tier1/cleCustomKernel.cpp b/clic/src/tier1/cleCustomKernel.cpp index b1a63b2b8..e5afb116e 100644 --- a/clic/src/tier1/cleCustomKernel.cpp +++ b/clic/src/tier1/cleCustomKernel.cpp @@ -13,7 +13,11 @@ CustomKernel::CustomKernel(const ProcessorPointer & device, : Operation(device, nb_parameters) { std::ifstream ifs(filename); - std::string ocl_source((std::istreambuf_iterator(ifs)), (std::istreambuf_iterator())); + if (ifs.fail()) + { + std::cout << "Error in loading custom kernel, could not find file " << filename << std::endl; + } + std::string ocl_source((std::istreambuf_iterator(ifs)), (std::istreambuf_iterator())); this->SetSource(name, ocl_source); } From d88b3c06b16c4383ed1f27f163e3b6849d87816c Mon Sep 17 00:00:00 2001 From: Stephane Rigaud Date: Mon, 28 Nov 2022 14:40:31 +0100 Subject: [PATCH 5/7] FIX: path to kernel file --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 27a952033..b2a2af1d4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -411,7 +411,7 @@ add_test(NAME core_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COM add_test(NAME core_buffer_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_buffer_test) add_test(NAME core_image_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_image_test) add_test(NAME core_kernel_test_buffer WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test buffer) -add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test "../../thirdparty/clesperanto-kernels/kernels/absolute.cl") +add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test "../../../thirdparty/clesperanto-kernels/kernels/absolute.cl") # add_test(NAME core_kernel_test_image WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test image) add_test(NAME absolute_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND absolute_test) add_test(NAME add_image_and_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND add_image_and_scalar_test) From 18f6a42f420c220f1b5c33ef1ed2131412808141 Mon Sep 17 00:00:00 2001 From: Stephane Rigaud Date: Mon, 28 Nov 2022 15:04:57 +0100 Subject: [PATCH 6/7] FIX: path to kernel file --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b2a2af1d4..27a952033 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -411,7 +411,7 @@ add_test(NAME core_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COM add_test(NAME core_buffer_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_buffer_test) add_test(NAME core_image_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_image_test) add_test(NAME core_kernel_test_buffer WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test buffer) -add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test "../../../thirdparty/clesperanto-kernels/kernels/absolute.cl") +add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test "../../thirdparty/clesperanto-kernels/kernels/absolute.cl") # add_test(NAME core_kernel_test_image WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test image) add_test(NAME absolute_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND absolute_test) add_test(NAME add_image_and_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND add_image_and_scalar_test) From 41c09726bcedecf108355dda5f0350470c5dd359 Mon Sep 17 00:00:00 2001 From: Stephane Rigaud Date: Mon, 28 Nov 2022 15:21:27 +0100 Subject: [PATCH 7/7] FIX: use ${PROJECT_SOURCE_DIR} for path specification --- tests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 27a952033..31ac3d95e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -411,7 +411,7 @@ add_test(NAME core_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COM add_test(NAME core_buffer_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_buffer_test) add_test(NAME core_image_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_image_test) add_test(NAME core_kernel_test_buffer WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test buffer) -add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test "../../thirdparty/clesperanto-kernels/kernels/absolute.cl") +add_test(NAME custom_kernel_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/custom_kernel_test ${PROJECT_SOURCE_DIR}/thirdparty/clesperanto-kernels/kernels/absolute.cl) # add_test(NAME core_kernel_test_image WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/core_kernel_test image) add_test(NAME absolute_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND absolute_test) add_test(NAME add_image_and_scalar_test WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND add_image_and_scalar_test)