## # Convenience method for defining test cases in this directory. ## function(halide_define_aot_test NAME) set(options OMIT_DEFAULT_GENERATOR) set(oneValueArgs) set(multiValueArgs EXTRA_LIBS) cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) set(TARGET "generator_aot_${NAME}") add_executable("${TARGET}" "${NAME}_aottest.cpp") target_include_directories("${TARGET}" PRIVATE "${Halide_SOURCE_DIR}/test/common") if (NOT args_OMIT_DEFAULT_GENERATOR) target_link_libraries(${TARGET} PRIVATE ${NAME}) endif () if (args_EXTRA_LIBS) target_link_libraries(${TARGET} PRIVATE ${args_EXTRA_LIBS}) endif () # TODO(#4938): remove need for these definitions if ("${HALIDE_TARGET}" MATCHES "opencl") target_compile_definitions("${TARGET}" PRIVATE TEST_OPENCL) endif () if ("${HALIDE_TARGET}" MATCHES "metal") target_compile_definitions("${TARGET}" PRIVATE TEST_METAL) endif () if ("${HALIDE_TARGET}" MATCHES "cuda") target_compile_definitions("${TARGET}" PRIVATE TEST_CUDA) endif () add_halide_test("${TARGET}" GROUPS generator) endfunction(halide_define_aot_test) ## # Common extra functionality needed by certain tests. ## add_library(cxx_mangling_externs STATIC cxx_mangling_externs.cpp) add_library(cxx_mangling_define_extern_externs STATIC cxx_mangling_define_extern_externs.cpp) ## # Create targets for all the generators as well as library targets for their default configurations ## set(GENERATOR_SRCS acquire_release_generator.cpp alias_generator.cpp argvcall_generator.cpp async_parallel_generator.cpp autograd_generator.cpp bit_operations_generator.cpp blur2x2_generator.cpp buffer_copy_generator.cpp buildmethod_generator.cpp can_use_target_generator.cpp cleanup_on_error_generator.cpp configure_generator.cpp cxx_mangling_define_extern_generator.cpp cxx_mangling_generator.cpp define_extern_opencl_generator.cpp embed_image_generator.cpp error_codes_generator.cpp example_generator.cpp extern_output_generator.cpp external_code_generator.cpp float16_t_generator.cpp gpu_object_lifetime_generator.cpp gpu_only_generator.cpp image_from_array_generator.cpp mandelbrot_generator.cpp matlab_generator.cpp memory_profiler_mandelbrot_generator.cpp metadata_tester_generator.cpp msan_generator.cpp multitarget_generator.cpp nested_externs_generator.cpp opencl_runtime_generator.cpp output_assign_generator.cpp pyramid_generator.cpp rdom_input_generator.cpp string_param_generator.cpp tiled_blur_generator.cpp user_context_generator.cpp user_context_insanity_generator.cpp variable_num_threads_generator.cpp ) # Special configuration for various tests. set(FN_NAME_cxx_mangling HalideTest::AnotherNamespace::cxx_mangling) set(FEATURES_cxx_mangling c_plus_plus_name_mangling) set(FN_NAME_cxx_mangling_define_extern HalideTest::cxx_mangling_define_extern) set(FEATURES_cxx_mangling_define_extern c_plus_plus_name_mangling user_context) set(FEATURES_gpu_object_lifetime debug) set(FEATURES_matlab matlab) set(FEATURES_memory_profiler_mandelbrot profile) set(PARAMS_metadata_tester input.type=uint8 input.dim=3 dim_only_input_buffer.type=uint8 untyped_input_buffer.type=uint8 untyped_input_buffer.dim=3 output.type=float32,float32 output.dim=3 input_not_nod.type=uint8 input_not_nod.dim=3 input_nod.dim=3 input_not.type=uint8 array_input.size=2 array_i8.size=2 array_i16.size=2 array_i32.size=2 array_h.size=2 buffer_array_input2.dim=3 buffer_array_input3.type=float32 buffer_array_input4.dim=3 buffer_array_input4.type=float32 buffer_array_input5.size=2 buffer_array_input6.size=2 buffer_array_input6.dim=3 buffer_array_input7.size=2 buffer_array_input7.type=float32 buffer_array_input8.size=2 buffer_array_input8.dim=3 buffer_array_input8.type=float32 buffer_f16_untyped.type=float16 array_outputs.size=2 array_outputs7.size=2 array_outputs8.size=2 array_outputs9.size=2 ) set(FEATURES_msan msan) set(HALIDE_TARGET_multitarget host host-no_bounds_query) set(FEATURES_multitarget c_plus_plus_name_mangling) set(FN_NAME_multitarget HalideTest::multitarget) set(PARAMS_pyramid levels=10) set(PARAMS_string_param rpn_expr="5 y * x +") set(FEATURES_user_context user_context) set(FEATURES_user_context_insanity user_context) # Create the generator / filter-library targets. foreach (FILE IN LISTS GENERATOR_SRCS) string(REPLACE "_generator.cpp" "" GEN_NAME "${FILE}") add_executable("${GEN_NAME}.generator" "${FILE}") target_link_libraries("${GEN_NAME}.generator" PRIVATE Halide::Generator) add_halide_library(${GEN_NAME} FROM "${GEN_NAME}.generator" PARAMS "${PARAMS_${GEN_NAME}}" TARGETS "${HALIDE_TARGET_${GEN_NAME}}" FUNCTION_NAME "${FN_NAME_${GEN_NAME}}" FEATURES "${FEATURES_${GEN_NAME}}" ${GRADS_${GEN_NAME}}) endforeach () target_link_libraries(external_code.generator PRIVATE external_code_generator_deps) ## # Define a nontrivial dependency for external_code.generator ## set(EXTERNAL_CPP "${CMAKE_CURRENT_SOURCE_DIR}/external_code_extern.cpp") set(EC32 "external_code_extern_bitcode_32") add_custom_command(OUTPUT "${EC32}.bc" DEPENDS "${EXTERNAL_CPP}" VERBATIM COMMAND clang -O3 -c -m32 -target le32-unknown-nacl-unknown -emit-llvm "$" -o "${EC32}.bc") add_custom_command(OUTPUT "${EC32}.cpp" DEPENDS "${EC32}.bc" binary2cpp COMMAND binary2cpp external_code_extern_bitcode_32 < "${EC32}.bc" > "${EC32}.cpp") set(EC64 "external_code_extern_bitcode_64") add_custom_command(OUTPUT "${EC64}.bc" DEPENDS "${EXTERNAL_CPP}" binary2cpp VERBATIM COMMAND clang -O3 -c -m64 -target le64-unknown-unknown-unknown -emit-llvm "$" -o "${EC64}.bc") add_custom_command(OUTPUT "${EC64}.cpp" DEPENDS "${EC64}.bc" binary2cpp COMMAND binary2cpp external_code_extern_bitcode_64 < "${EC64}.bc" > "${EC64}.cpp") set(ECCPP "external_code_extern_cpp_source") add_custom_command(OUTPUT "${ECCPP}.cpp" DEPENDS "${EXTERNAL_CPP}" binary2cpp VERBATIM COMMAND binary2cpp external_code_extern_cpp_source < "$" > "${ECCPP}.cpp") add_library(external_code_generator_deps OBJECT "${EC32}.cpp" "${EC64}.cpp" "${ECCPP}.cpp") ## # Create targets for the default AOT tests ## halide_define_aot_test(argvcall) halide_define_aot_test(buffer_copy) halide_define_aot_test(can_use_target) #halide_define_aot_test(cleanup_on_error) # TODO: requires access to internal header runtime/device_interface.h halide_define_aot_test(configure) halide_define_aot_test(embed_image) halide_define_aot_test(error_codes) halide_define_aot_test(example) halide_define_aot_test(external_code) halide_define_aot_test(float16_t) halide_define_aot_test(gpu_object_lifetime) halide_define_aot_test(gpu_only) halide_define_aot_test(image_from_array) halide_define_aot_test(mandelbrot) halide_define_aot_test(memory_profiler_mandelbrot) halide_define_aot_test(msan) halide_define_aot_test(multitarget) halide_define_aot_test(opencl_runtime) halide_define_aot_test(output_assign) halide_define_aot_test(pyramid) halide_define_aot_test(string_param) halide_define_aot_test(user_context) halide_define_aot_test(user_context_insanity) halide_define_aot_test(variable_num_threads) ## # Create targets for the AOT tests with custom rules ## # Acquire-Release test requires CUDA halide_define_aot_test(acquire_release) if (TARGET_PTX AND HALIDE_TARGET MATCHES "cuda") include(AddCudaToTarget) add_cuda_to_target(generator_aot_acquire_release PRIVATE) endif () if (TARGET_PTX AND HALIDE_TARGET MATCHES "opencl") find_package(OpenCL REQUIRED) target_link_libraries(generator_aot_acquire_release PRIVATE OpenCL::OpenCL) endif () # Alias generator test add_halide_library(alias_with_offset_42 FROM alias.generator GENERATOR alias_with_offset_42) halide_define_aot_test(alias EXTRA_LIBS alias_with_offset_42) # Autograd generator test halide_define_aot_test(autograd) if (TARGET generator_aot_autograd) add_halide_library(autograd_grad GRADIENT_DESCENT FROM autograd.generator GENERATOR autograd PARAMS "auto_schedule=true") target_link_libraries(generator_aot_autograd PRIVATE autograd_grad) endif() # CXX mangling generator test. halide_define_aot_test(cxx_mangling) if (TARGET cxx_mangling) target_link_libraries(cxx_mangling INTERFACE cxx_mangling_externs) if (TARGET_PTX AND HALIDE_TARGET MATCHES "cuda") add_halide_library(cxx_mangling_gpu FROM cxx_mangling.generator GENERATOR cxx_mangling FUNCTION_NAME HalideTest::cxx_mangling_gpu FEATURES c_plus_plus_name_mangling cuda) target_link_libraries(generator_aot_cxx_mangling PRIVATE cxx_mangling_gpu) endif () endif () # CXX mangling with extern generator test halide_define_aot_test(cxx_mangling_define_extern) if (TARGET cxx_mangling_define_extern) target_link_libraries(cxx_mangling_define_extern INTERFACE cxx_mangling_externs cxx_mangling_define_extern_externs) target_link_libraries(cxx_mangling_define_extern_externs PRIVATE cxx_mangling_externs cxx_mangling) endif () # Define extern for OpenCL halide_define_aot_test(define_extern_opencl) if (TARGET_PTX AND HALIDE_TARGET MATCHES "opencl") find_package(OpenCL REQUIRED) target_link_libraries(generator_aot_define_extern_opencl PRIVATE OpenCL::OpenCL) endif () # Matlab generator test halide_define_aot_test(matlab) if (TARGET generator_aot_matlab) set_target_properties(generator_aot_matlab PROPERTIES ENABLE_EXPORTS True) endif () # Metadata tester add_halide_library(metadata_tester_ucon FROM metadata_tester.generator GENERATOR metadata_tester FEATURES user_context PARAMS ${PARAMS_metadata_tester}) halide_define_aot_test(metadata_tester EXTRA_LIBS metadata_tester_ucon) # Nested externs test add_halide_library(nested_externs_root FROM nested_externs.generator) add_halide_library(nested_externs_inner FROM nested_externs.generator) add_halide_library(nested_externs_combine FROM nested_externs.generator) add_halide_library(nested_externs_leaf FROM nested_externs.generator) halide_define_aot_test(nested_externs OMIT_DEFAULT_GENERATOR EXTRA_LIBS nested_externs_root nested_externs_inner nested_externs_combine nested_externs_leaf) # Tiled blur halide_define_aot_test(tiled_blur EXTRA_LIBS blur2x2)