https://github.com/halide/Halide
Raw File
Tip revision: 1ebf2598bce0b92a457556dc619139dc7686ee37 authored by Andrew Adams on 14 February 2017, 21:59:30 UTC
Better Affine Var tracking
Tip revision: 1ebf259
CMakeLists.txt
option(WITH_TEST_INTERNAL "Build and run internal tests" ON)
option(WITH_TEST_CORRECTNESS "Build correctness tests" ON)
option(WITH_TEST_ERROR "Build error tests" ON)
option(WITH_TEST_WARNING "Build warning tests" ON)
option(WITH_TEST_PERFORMANCE "Build performance tests" ON)
option(WITH_TEST_OPENGL "Build OpenGL tests" ON)
option(WITH_TEST_GENERATORS "Build Generator tests" ON)

if (WITH_TEST_INTERNAL)
  message(STATUS "Internal tests enabled")
  halide_project(test_internal internal internal.cpp)
  # Run internal tests after building
  add_custom_command(TARGET test_internal
                     POST_BUILD
                     COMMAND test_internal
                     COMMENT "Running internal tests")
else()
  message(WARNING "Internal tests disabled")
endif()

function(test_plain_c_includes)
  set(folder "correctness")
  set(name "plain_c_includes")
  set(TEST_NAMES "${folder}_${name}")
  add_executable("${folder}_${name}" "${CMAKE_CURRENT_SOURCE_DIR}/${folder}/${name}.c")
  target_include_directories("${folder}_${name}" PRIVATE "${CMAKE_BINARY_DIR}/include")
  set(TEST_NAMES "${TEST_NAMES}" PARENT_SCOPE)
endfunction(test_plain_c_includes)

function(tests folder)
  file(GLOB TESTS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/${folder}" "${CMAKE_CURRENT_SOURCE_DIR}/${folder}/*.cpp")
  set(TEST_NAMES "")
  foreach(file ${TESTS})
    string(REPLACE ".cpp" "" name "${file}")
    # Test links against libHalide
    halide_project("${folder}_${name}" "${folder}" "${folder}/${file}")
    list(APPEND TEST_NAMES "${folder}_${name}")
    target_include_directories("${folder}_${name}" PRIVATE "${CMAKE_SOURCE_DIR}")
    target_compile_definitions("${folder}_${name}"  PRIVATE "-DLLVM_VERSION=${LLVM_VERSION}")
  endforeach()
  set(TEST_NAMES "${TEST_NAMES}" PARENT_SCOPE)
endfunction(tests)

if (WITH_TEST_CORRECTNESS)
  tests(correctness)
  use_image_io(correctness_image_io)
  test_plain_c_includes()
endif()
if (WITH_TEST_ERROR)
  tests(error)
endif()
if (WITH_TEST_WARNING)
  tests(warning)
endif()
if (WITH_TEST_PERFORMANCE)
  tests(performance)
endif()
if (WITH_TEST_OPENGL)
  find_package(OpenGL)
  if (OpenGL_FOUND)
    tests(opengl)
    foreach(test_name ${TEST_NAMES})
      target_link_libraries("${test_name}" PRIVATE "${OPENGL_LIBRARIES}")
    endforeach()
  endif()
endif()

function(add_test_generator NAME)
  set(options WITH_STUB)
  set(oneValueArgs GENERATOR_NAME)
  set(multiValueArgs STUB_DEPS)
  cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  # convert TRUE|FALSE -> WITH_STUB|emptystring
  if (${args_WITH_STUB})
    set(args_WITH_STUB WITH_STUB)
  else()
    set(args_WITH_STUB )
  endif()
  halide_add_generator("${NAME}.generator"
                       STUB_GENERATOR_NAME "${args_GENERATOR_NAME}"
                       SRCS "${CMAKE_CURRENT_SOURCE_DIR}/generator/${NAME}_generator.cpp"
                       STUB_DEPS ${args_STUB_DEPS}
                       ${args_WITH_STUB})
endfunction(add_test_generator)

function(halide_define_jit_test NAME)
  set(options )
  set(oneValueArgs )
  set(multiValueArgs STUB_DEPS)
  cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

  set(ALLSTUBS )
  foreach(STUB ${args_STUB_DEPS})
    list(APPEND ALLSTUBS $<TARGET_OBJECTS:${STUB}.objlib>)
  endforeach()

  halide_project("generator_jit_${NAME}"
                 "generator"
                 "${CMAKE_CURRENT_SOURCE_DIR}/generator/${NAME}_jittest.cpp"
                 ${ALLSTUBS})
  foreach(STUB_DEP ${args_STUB_DEPS})
    halide_add_generator_stub_dependency(TARGET "generator_jit_${NAME}"
                                         STUB_GENERATOR_TARGET ${STUB_DEP})
  endforeach()
endfunction(halide_define_jit_test)

include(../HalideGenerator.cmake)

# Usage:
#   halide_define_aot_test(NAME <basename>
#                       [GENERATED_FUNCTION <function name, including namespace]
#                       [GENERATOR_HALIDE_TARGET Halide target, if not "host"]
#                       [GENERATOR_ARGS extra generator args])
function(halide_define_aot_test NAME)
  set(options OMIT_DEFAULT_GENERATOR)
  set(oneValueArgs GENERATED_FUNCTION GENERATOR_NAME GENERATOR_HALIDE_TARGET)
  set(multiValueArgs GENERATOR_ARGS STUB_DEPS)
  cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

  set(TARGET "generator_aot_${NAME}")

  add_executable("${TARGET}" "${CMAKE_CURRENT_SOURCE_DIR}/generator/${NAME}_aottest.cpp")
  if (MSVC)
  else()
    target_compile_options("${TARGET}" PUBLIC "-std=c++11") # HalideBuffer.h needs C++11
  endif()
  target_include_directories("${TARGET}" PRIVATE "${CMAKE_SOURCE_DIR}/tools")
  target_include_directories("${TARGET}" PRIVATE "${CMAKE_SOURCE_DIR}/src/runtime")
  target_include_directories("${TARGET}" PRIVATE "${CMAKE_SOURCE_DIR}")
  set_target_properties("${TARGET}" PROPERTIES FOLDER "generator")
  foreach(STUB_DEP ${args_STUB_DEPS})
    halide_add_generator_stub_dependency(TARGET "${TARGET}"
                                         STUB_GENERATOR_TARGET ${STUB_DEP})
  endforeach()
  if (MSVC)
    # 4088: "/FORCE used, image may not work"
    set_target_properties("${TARGET}" PROPERTIES LINK_FLAGS "/ignore:4088")
  endif()

  if (NOT ${args_OMIT_DEFAULT_GENERATOR})
    if (NOT args_GENERATED_FUNCTION)
      set(args_GENERATED_FUNCTION "${NAME}")
    endif()
    if (NOT args_GENERATOR_HALIDE_TARGET)
      set(args_GENERATOR_HALIDE_TARGET "host")
    endif()
    if (NOT args_GENERATOR_NAME)
      set(args_GENERATOR_NAME ${NAME})
    endif()

    set(AOT_LIBRARY_TARGET "${NAME}")
    halide_add_aot_library("${AOT_LIBRARY_TARGET}"
                           GENERATOR_TARGET "${NAME}.generator"
                           GENERATOR_NAME "${args_GENERATOR_NAME}"
                           GENERATED_FUNCTION "${args_GENERATED_FUNCTION}"
                           GENERATOR_ARGS "target=${args_GENERATOR_HALIDE_TARGET}" "${args_GENERATOR_ARGS}")
    halide_add_aot_library_dependency("${TARGET}" "${AOT_LIBRARY_TARGET}")
  endif()

endfunction(halide_define_aot_test)

function(halide_add_aot_test_dependency NAME)
  set(options )
  set(oneValueArgs AOT_LIBRARY_TARGET GENERATED_FUNCTION GENERATOR_NAME GENERATOR_TARGET GENERATOR_HALIDE_TARGET)
  set(multiValueArgs GENERATOR_ARGS)
  cmake_parse_arguments(args "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

  set(TARGET "generator_aot_${NAME}")

  if (NOT args_GENERATOR_TARGET)
    set(args_GENERATOR_TARGET "${NAME}")
  endif()
  if (NOT args_GENERATED_FUNCTION)
    set(args_GENERATED_FUNCTION "${args_AOT_LIBRARY_TARGET}")
  endif()
    if (NOT args_GENERATOR_HALIDE_TARGET)
      set(args_GENERATOR_HALIDE_TARGET "host")
    endif()

  halide_add_aot_library("${args_AOT_LIBRARY_TARGET}"
                         GENERATOR_TARGET "${args_GENERATOR_TARGET}.generator"
                         GENERATOR_NAME "${args_GENERATOR_NAME}"
                         GENERATED_FUNCTION "${args_GENERATED_FUNCTION}"
                         GENERATOR_ARGS "target=${args_GENERATOR_HALIDE_TARGET}" "${args_GENERATOR_ARGS}")
  halide_add_aot_library_dependency("${TARGET}" "${args_AOT_LIBRARY_TARGET}")
endfunction(halide_add_aot_test_dependency)

if (WITH_TEST_GENERATORS)

  # Explicitly define the generator targets; each has a build target
  # of the form "name.generator"
  add_test_generator(acquire_release)
  add_test_generator(argvcall)
  add_test_generator(can_use_target)
  add_test_generator(cleanup_on_error)
  add_test_generator(cxx_mangling_define_extern)
  add_test_generator(cxx_mangling)
  add_test_generator(embed_image)
  add_test_generator(error_codes)
  add_test_generator(example WITH_STUB)
  add_test_generator(float16_t)
  add_test_generator(gpu_object_lifetime)
  add_test_generator(gpu_only)
  add_test_generator(image_from_array)
  add_test_generator(mandelbrot)
  add_test_generator(matlab)
  add_test_generator(memory_profiler_mandelbrot)
  add_test_generator(metadata_tester)
  add_test_generator(msan)
  add_test_generator(multitarget)
  add_test_generator(nested_externs)
  add_test_generator(pyramid)
  add_test_generator(stubtest WITH_STUB
                     GENERATOR_NAME StubNS1::StubNS2::StubTest)
  # the stubuser generator needs the stub from stubtest
  add_test_generator(stubuser
                     GENERATOR_NAME stubuser
                     STUB_DEPS stubtest.generator)
  add_test_generator(tiled_blur_blur)
  add_test_generator(tiled_blur)
  add_test_generator(user_context)
  add_test_generator(user_context_insanity)
  add_test_generator(variable_num_threads)

  # ------ Generator tests for just-in-time mode: ------
  halide_define_jit_test(example
                         STUB_DEPS example.generator)
  halide_define_jit_test(stubtest
                         STUB_DEPS stubtest.generator)

  # ------ Generator tests for ahead-of-time mode: ------

  # Create tests for ahead of-time-compiled generators. This will produce two
  # executables, one containing the generator itself
  # (e.g. from example_generator.cpp) and used at build time, and the other, the
  # test that executes the generated code (e.g. from example_aottest.cpp).

  # Tests with no special requirements
  halide_define_aot_test(acquire_release)
  halide_define_aot_test(argvcall)
  halide_define_aot_test(can_use_target)
  halide_define_aot_test(cleanup_on_error)
  halide_define_aot_test(embed_image)
  halide_define_aot_test(error_codes)
  halide_define_aot_test(example)
  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(stubuser)
  halide_define_aot_test(variable_num_threads)

  # Tests that require nonstandard targets, namespaces, args, etc.
  halide_define_aot_test(matlab
                         GENERATOR_HALIDE_TARGET host-matlab)

  halide_define_aot_test(multitarget
                         GENERATOR_HALIDE_TARGET host-debug-c_plus_plus_name_mangling,host-c_plus_plus_name_mangling
                         GENERATED_FUNCTION HalideTest::multitarget)

  halide_define_aot_test(user_context
                         GENERATOR_HALIDE_TARGET host-user_context)

  halide_define_aot_test(user_context_insanity
                         GENERATOR_HALIDE_TARGET host-user_context)

  halide_define_aot_test(cxx_mangling
                         GENERATOR_HALIDE_TARGET host-c_plus_plus_name_mangling
                         GENERATED_FUNCTION HalideTest::cxx_mangling)
  if (TARGET_PTX)
    halide_add_aot_test_dependency(cxx_mangling
                                 AOT_LIBRARY_TARGET cxx_mangling_gpu
                                 GENERATED_FUNCTION HalideTest::cxx_mangling_gpu
                                 GENERATOR_HALIDE_TARGET host-c_plus_plus_name_mangling-cuda)
  endif()

  halide_define_aot_test(pyramid
                         GENERATOR_ARGS levels=10)

  halide_define_aot_test(msan
                         GENERATOR_HALIDE_TARGET host-msan)

  # stubtest has input and output funcs with undefined types; this is fine for stub
  # usage (the types can be inferred), but for AOT compilation, we must make the types
  # concrete via generator args.
  set(STUBTEST_GENERATOR_ARGS
      untyped_buffer_input.type=uint8 untyped_buffer_input.dim=3
      simple_input.type=float32
      array_input.type=float32 array_input.size=2
      int_arg.size=2
      tuple_output.type=float32,float32
  )
  halide_define_aot_test(stubtest
                         GENERATOR_NAME StubNS1::StubNS2::StubTest
                         GENERATOR_ARGS "${STUBTEST_GENERATOR_ARGS}")

  # Tests that require additional dependencies, args, etc
  set(MDTEST_GEN_ARGS
      input.type=uint8 input.dim=3
      type_only_input_buffer.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
      array_outputs.size=2
  )
  halide_define_aot_test(metadata_tester
                         GENERATOR_ARGS "${MDTEST_GEN_ARGS}")
  halide_add_aot_test_dependency(metadata_tester
                                 AOT_LIBRARY_TARGET metadata_tester_ucon
                                 GENERATED_FUNCTION metadata_tester_ucon
                                 GENERATOR_HALIDE_TARGET host-user_context
                                 GENERATOR_ARGS ${MDTEST_GEN_ARGS})

  halide_define_aot_test(tiled_blur)
  halide_add_aot_test_dependency(tiled_blur
                                 GENERATOR_TARGET tiled_blur_blur
                                 AOT_LIBRARY_TARGET tiled_blur_blur)

  halide_define_aot_test(cxx_mangling_define_extern
                         GENERATOR_HALIDE_TARGET host-c_plus_plus_name_mangling-user_context
                         GENERATED_FUNCTION HalideTest::cxx_mangling_define_extern)
  # The cxx_mangling library was already defined implicitly, above,
  # so just add a dependency on it
  halide_add_aot_library_dependency(generator_aot_cxx_mangling_define_extern cxx_mangling)

  halide_define_aot_test(nested_externs OMIT_DEFAULT_GENERATOR)
  halide_add_aot_test_dependency(nested_externs
                                 AOT_LIBRARY_TARGET nested_externs_root
                                 GENERATOR_NAME nested_externs_root)
  halide_add_aot_test_dependency(nested_externs
                                 AOT_LIBRARY_TARGET nested_externs_inner
                                 GENERATOR_NAME nested_externs_inner)
  halide_add_aot_test_dependency(nested_externs
                                 AOT_LIBRARY_TARGET nested_externs_combine
                                 GENERATOR_NAME nested_externs_combine)
  halide_add_aot_test_dependency(nested_externs
                                 AOT_LIBRARY_TARGET nested_externs_leaf
                                 GENERATOR_NAME nested_externs_leaf)

endif()
back to top