diff --git a/clic/include/tier1/cleCustomKernel.hpp b/clic/include/tier1/cleCustomKernel.hpp new file mode 100644 index 000000000..979830972 --- /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(scalars); + 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..e5afb116e --- /dev/null +++ b/clic/src/tier1/cleCustomKernel.cpp @@ -0,0 +1,42 @@ +#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); + 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); +} + +auto +CustomKernel::AddImages(const std::map & images) -> void +{ + for (auto ite = images.begin(); ite != images.end(); ite++) + { + this->AddParameter(ite->first, ite->second); + } +} + +auto +CustomKernel::AddScalars(const std::map & scalars) -> void +{ + for (auto ite = scalars.begin(); ite != scalars.end(); ite++) + { + this->AddParameter(ite->first, ite->second); + } +} + +} // namespace cle diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 13214d7ae..31ac3d95e 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 ${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) @@ -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..5c439e30d --- /dev/null +++ b/tests/custom_kernel_test.cpp @@ -0,0 +1,155 @@ + + +#include + +#include "cleCustomKernel.hpp" +#include "clesperanto.hpp" + +template +auto +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]); + 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(), path, "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, argv[1])) + { + 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