diff --git a/Makefile b/Makefile index b1aef1fc1dea..9bfbcd26435f 100644 --- a/Makefile +++ b/Makefile @@ -1177,6 +1177,7 @@ GENERATOR_EXTERNAL_TEST_GENERATOR := $(shell ls $(ROOT_DIR)/test/generator/*_gen TUTORIALS = $(filter-out %_generate.cpp, $(shell ls $(ROOT_DIR)/tutorial/*.cpp)) MULLAPUDI2016_TESTS = $(shell ls $(ROOT_DIR)/test/autoschedulers/mullapudi2016/*.cpp) LI2018_TESTS = $(shell ls $(ROOT_DIR)/test/autoschedulers/li2018/test.cpp) +ADAMS2019_TESTS = $(shell ls $(ROOT_DIR)/test/autoschedulers/adams2019/test.cpp) test_correctness: $(CORRECTNESS_TESTS:$(ROOT_DIR)/test/correctness/%.cpp=quiet_correctness_%) $(CORRECTNESS_TESTS:$(ROOT_DIR)/test/correctness/%.c=quiet_correctness_%) test_performance: $(PERFORMANCE_TESTS:$(ROOT_DIR)/test/performance/%.cpp=performance_%) @@ -1295,7 +1296,8 @@ build_tests: $(CORRECTNESS_TESTS:$(ROOT_DIR)/test/correctness/%.cpp=$(BIN_DIR)/c $(GENERATOR_EXTERNAL_TESTS:$(ROOT_DIR)/test/generator/%_aottest.cpp=$(BIN_DIR)/$(TARGET)/generator_aot_%) \ $(GENERATOR_EXTERNAL_TESTS:$(ROOT_DIR)/test/generator/%_jittest.cpp=$(BIN_DIR)/generator_jit_%) \ $(MULLAPUDI2016_TESTS:$(ROOT_DIR)/test/autoschedulers/mullapudi2016/%.cpp=$(BIN_DIR)/mullapudi2016_%) \ - $(LI2018_TESTS:$(ROOT_DIR)/test/autoschedulers/li2018/%.cpp=$(BIN_DIR)/li2018_%) + $(LI2018_TESTS:$(ROOT_DIR)/test/autoschedulers/li2018/%.cpp=$(BIN_DIR)/li2018_%) \ + $(ADAMS2019_TESTS:$(ROOT_DIR)/test/autoschedulers/adams2019/%.cpp=$(BIN_DIR)/adams2019_%) clean_generator: rm -rf $(BIN_DIR)/*.generator @@ -1377,6 +1379,9 @@ $(BIN_DIR)/mullapudi2016_%: $(ROOT_DIR)/test/autoschedulers/mullapudi2016/%.cpp $(BIN_DIR)/li2018_%: $(ROOT_DIR)/test/autoschedulers/li2018/%.cpp $(BIN_DIR)/libHalide.$(SHARED_EXT) $(INCLUDE_DIR)/Halide.h $(CXX) $(TEST_CXX_FLAGS) $(OPTIMIZE_FOR_BUILD_TIME) $< -I$(INCLUDE_DIR) $(TEST_LD_FLAGS) -o $@ +$(BIN_DIR)/adams2019_%: $(ROOT_DIR)/test/autoschedulers/adams2019/%.cpp $(BIN_DIR)/libHalide.$(SHARED_EXT) $(INCLUDE_DIR)/Halide.h + $(CXX) $(TEST_CXX_FLAGS) $(OPTIMIZE_FOR_BUILD_TIME) $< -I$(INCLUDE_DIR) $(TEST_LD_FLAGS) -o $@ + # TODO(srj): this doesn't auto-delete, why not? .INTERMEDIATE: $(BIN_DIR)/%.generator @@ -2018,10 +2023,12 @@ li2018_%: $(BIN_DIR)/li2018_% $(BIN_LI2018) cd $(TMP_DIR) ; $(CURDIR)/$< $(realpath $(BIN_LI2018)) @-echo -# The other autoschedulers contain their own tests -test_adams2019: distrib - $(MAKE) -f $(SRC_DIR)/autoschedulers/adams2019/Makefile test \ - HALIDE_DISTRIB_PATH=$(CURDIR)/$(DISTRIB_DIR) +test_adams2019: $(ADAMS2019_TESTS:$(ROOT_DIR)/test/autoschedulers/adams2019/%.cpp=adams2019_%) + +adams2019_test: $(BIN_DIR)/adams2019_test $(BIN_ADAMS2019) $(SRC_DIR)/autoschedulers/adams2019/baseline.weights + @-mkdir -p $(TMP_DIR) + cd $(TMP_DIR) ; $(CURDIR)/$< $(realpath $(BIN_ADAMS2019)) $(realpath $(SRC_DIR)/autoschedulers/adams2019/baseline.weights) + @-echo time_compilation_test_%: $(BIN_DIR)/test_% $(TIME_COMPILATION) compile_times_correctness.csv make -f $(THIS_MAKEFILE) $(@:time_compilation_test_%=test_%) diff --git a/src/autoschedulers/adams2019/CMakeLists.txt b/src/autoschedulers/adams2019/CMakeLists.txt index 2d9da255bb54..c6a56d3f38c4 100644 --- a/src/autoschedulers/adams2019/CMakeLists.txt +++ b/src/autoschedulers/adams2019/CMakeLists.txt @@ -2,31 +2,7 @@ # Build rules for the Adams2019 autoscheduler library ## -function(add_adams2019_test NAME) - set(options "") - set(oneValueArgs ENVIRONMENT) - set(multiValueArgs COMMAND LABELS) - cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - if (NOT ARGS_COMMAND) - set(ARGS_COMMAND ${NAME}) - endif() - - if (NOT ARGS_LABELS) - set(ARGS_LABELS "") - endif() - list(APPEND ARGS_LABELS Adams2019) - list(APPEND ARGS_LABELS auto_schedule) - - add_test(NAME ${NAME} - COMMAND ${ARGS_COMMAND}) - set_tests_properties(${NAME} - PROPERTIES - LABELS "${ARGS_LABELS}" - ENVIRONMENT "${ENVIRONMENT}") -endfunction() - - +# ================================================================= # weights set(WF_CPP baseline.cpp) configure_file(baseline.weights baseline.weights COPYONLY) @@ -59,6 +35,7 @@ add_executable(adams2019_retrain_cost_model $) target_link_libraries(adams2019_retrain_cost_model PRIVATE ASLog adams2019_cost_model adams2019_train_cost_model Halide::Halide Halide::Plugin) +# ================================================================= ## # Main autoscheduler library ## @@ -76,45 +53,6 @@ add_autoscheduler(NAME Adams2019 target_link_libraries(Halide_Adams2019 PRIVATE ASLog ParamParser adams2019_cost_model adams2019_train_cost_model) -## -# Tests and demos -# TODO(#4053): move these to a separate folder since they're tests. -## - -# ================================================================= - -add_executable(adams2019_demo.generator demo_generator.cpp) -target_link_libraries(adams2019_demo.generator PRIVATE Halide::Generator) - -add_halide_library(adams2019_demo FROM adams2019_demo.generator - GENERATOR demo - TARGETS cmake - AUTOSCHEDULER Halide::Adams2019 - REGISTRATION DEMO_REGISTRATION_FILE) - -add_executable(adams2019_demo_apps_autoscheduler ${DEMO_REGISTRATION_FILE}) -target_link_libraries(adams2019_demo_apps_autoscheduler PRIVATE adams2019_demo Halide::RunGenMain) - -add_adams2019_test(adams2019_demo_apps_autoscheduler - COMMAND adams2019_demo_apps_autoscheduler --benchmarks=all --benchmark_min_time=1 --estimate_all) - -# ================================================================= - -add_executable(adams2019_included_schedule_file.generator included_schedule_file_generator.cpp) -target_link_libraries(adams2019_included_schedule_file.generator PRIVATE Halide::Generator) - -add_halide_library(adams2019_included_schedule_file FROM adams2019_included_schedule_file.generator - GENERATOR included_schedule_file - TARGETS cmake - AUTOSCHEDULER Halide::Adams2019 - REGISTRATION adams2019_included_schedule_reg) - -add_executable(adams2019_demo_included_schedule_file ${adams2019_included_schedule_reg}) -target_link_libraries(adams2019_demo_included_schedule_file PRIVATE adams2019_included_schedule_file Halide::RunGenMain) - -add_adams2019_test(adams2019_demo_included_schedule_file - COMMAND adams2019_demo_included_schedule_file --benchmarks=all --benchmark_min_time=1 --estimate_all) - # ==================================================== # Auto-tuning support utilities. # TODO(#4053): implement auto-tuning support in CMake? @@ -128,27 +66,18 @@ add_executable(adams2019_weightsdir_to_weightsfile weightsdir_to_weightsfile.cpp target_link_libraries(adams2019_weightsdir_to_weightsfile PRIVATE Halide::Runtime) # ================================================================= -# Smaller tests +# Tests for private/internal functionality of Adams2019 (vs for public functionality, +# which is handled in tests/autoschedulers/Adams2019) -if (BUILD_SHARED_LIBS) - add_executable(adams2019_test_apps_autoscheduler test.cpp) - target_link_libraries(adams2019_test_apps_autoscheduler PRIVATE Halide::Halide Halide::Tools ${CMAKE_DL_LIBS}) +if (WITH_TESTS) - add_adams2019_test(adams2019_test_apps_autoscheduler - COMMAND adams2019_test_apps_autoscheduler $ ${CMAKE_CURRENT_SOURCE_DIR}/baseline.weights - LABELS multithreaded - ENVIRONMENT "LD_LIBRARY_PATH=$:$ENV{LD_LIBRARY_PATH}") -endif () - -## - -add_executable(adams2019_test_perfect_hash_map test_perfect_hash_map.cpp) - -add_adams2019_test(adams2019_test_perfect_hash_map) - -## + add_executable(adams2019_test_perfect_hash_map test_perfect_hash_map.cpp) + add_test(NAME adams2019_test_perfect_hash_map COMMAND adams2019_test_perfect_hash_map) + set_tests_properties(adams2019_test_perfect_hash_map PROPERTIES LABELS "adams2019;autoschedulers;auto_schedule") -add_executable(adams2019_test_function_dag test_function_dag.cpp FunctionDAG.cpp) -target_link_libraries(adams2019_test_function_dag PRIVATE ASLog Halide::Halide Halide::Tools Halide::Plugin) + add_executable(adams2019_test_function_dag test_function_dag.cpp FunctionDAG.cpp) + target_link_libraries(adams2019_test_function_dag PRIVATE ASLog Halide::Halide Halide::Tools Halide::Plugin) + add_test(NAME adams2019_test_function_dag COMMAND adams2019_test_function_dag) + set_tests_properties(adams2019_test_function_dag PROPERTIES LABELS "adams2019;autoschedulers;auto_schedule") -add_adams2019_test(adams2019_test_function_dag) +endif() \ No newline at end of file diff --git a/src/autoschedulers/adams2019/Makefile b/src/autoschedulers/adams2019/Makefile index cbabe9b94b42..fb0ac8461af1 100644 --- a/src/autoschedulers/adams2019/Makefile +++ b/src/autoschedulers/adams2019/Makefile @@ -112,129 +112,8 @@ $(BIN)/weightsdir_to_weightsfile: $(SRC)/weightsdir_to_weightsfile.cpp $(SRC)/We @mkdir -p $(@D) $(CXX) $(CXXFLAGS) $^ $(OPTIMIZE) -o $@ -# A sample generator to autoschedule. Note that if it statically links -# to libHalide, then it must be build with $(USE_EXPORT_DYNAMIC), or the -# autoscheduler can't find the libHalide symbols that it needs. -$(GENERATOR_BIN)/demo.generator: $(SRC)/demo_generator.cpp $(GENERATOR_DEPS) - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) $(USE_EXPORT_DYNAMIC) -g $(filter %.cpp,$^) -o $@ $(LIBHALIDE_LDFLAGS) - -# To use the autoscheduler, set a few environment variables and use the -p flag to the generator to load the autoscheduler as a plugin -$(BIN)/%/demo.a: $(GENERATOR_BIN)/demo.generator $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) - @mkdir -p $(@D) - $(GENERATOR_BIN)/demo.generator -g demo -o $(@D) -f demo target=$* \ - autoscheduler=Adams2019 \ - autoscheduler.parallelism=32 \ - autoscheduler.weights_path=$(SRC)/baseline.weights \ - -p $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) - -$(BIN)/%/demo.rungen: $(BIN)/%/RunGenMain.o $(BIN)/%/demo.registration.cpp $(BIN)/%/demo.a - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) -I$(BIN)/$* $^ -o $@ $(HALIDE_SYSTEM_LIBS) $(IMAGE_IO_FLAGS) - -# demonstrates single-shot use of the autoscheduler -demo: $(BIN)/$(HL_TARGET)/demo.rungen $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) - $< --benchmarks=all --benchmark_min_time=1 --estimate_all - -# demonstrates an autotuning loop -# (using $(BIN) and $(SRC) here seems overkill, but makes copy-n-paste elsewhere easier) -autotune: $(GENERATOR_BIN)/demo.generator $(BIN)/featurization_to_sample $(BIN)/get_host_target $(BIN)/retrain_cost_model $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) $(SRC)/autotune_loop.sh - @mkdir -p $(@D) - bash $(SRC)/autotune_loop.sh \ - $(GENERATOR_BIN)/demo.generator \ - demo \ - "" \ - $(SRC)/baseline.weights \ - $(BIN) \ - $(HALIDE_DISTRIB_PATH) \ - $(BIN)/samples - -$(BIN)/test_perfect_hash_map: $(SRC)/test_perfect_hash_map.cpp $(SRC)/PerfectHashMap.h - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) $< -o $@ - -$(BIN)/test_function_dag: $(SRC)/test_function_dag.cpp $(SRC)/FunctionDAG.h $(SRC)/FunctionDAG.cpp $(COMMON_DIR)/ASLog.h $(COMMON_DIR)/ASLog.cpp - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) $(USE_EXPORT_DYNAMIC) $(filter-out %.h,$^) -o $@ $(LIBHALIDE_LDFLAGS) $(HALIDE_SYSTEM_LIBS) - -# Simple jit-based test -$(BIN)/%/test: $(SRC)/test.cpp $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) $(USE_EXPORT_DYNAMIC) $< -o $@ $(LIBHALIDE_LDFLAGS) $(HALIDE_SYSTEM_LIBS) - -test_perfect_hash_map: $(BIN)/test_perfect_hash_map - $^ - -test_function_dag: $(BIN)/test_function_dag - $^ - -run_test: $(BIN)/$(HL_TARGET)/test - LD_LIBRARY_PATH=$(BIN):$(LD_LIBRARY_PATH) $< $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) $(SRC)/baseline.weights - -.PHONY: test clean - -# Note that 'make build' and 'make test' is used by Halide buildbots -# to spot-check changes, so it's important to try a little of each of -# the important paths here, including single-shot and autotune-loop -build: $(BIN)/$(HL_TARGET)/test \ - $(BIN)/test_perfect_hash_map \ - $(BIN)/test_function_dag \ - $(BIN)/$(HL_TARGET)/included_schedule_file.rungen \ - $(GENERATOR_BIN)/demo.generator \ - $(BIN)/featurization_to_sample \ - $(BIN)/get_host_target \ - $(BIN)/retrain_cost_model \ - $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) - -test: run_test test_perfect_hash_map test_function_dag demo test_included_schedule_file autotune +.PHONY: clean clean: rm -rf $(BIN) -# A sample generator to demonstrate including autogenerated .sample.h -# files for scheduling purposes; the catch here is that we'll need -# to be able to compile the Generator two different ways: -# -# - one that will be used to generate the .schedule.h -# - one that will consume the .schedule.h generated above -# -# We'll use the preprocessor (GENERATING_SCHEDULE) to distinguish between these two. - -$(GENERATOR_BIN)/included_schedule_file_none.generator: $(SRC)/included_schedule_file_generator.cpp $(GENERATOR_DEPS) - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) $(USE_EXPORT_DYNAMIC) -DGENERATING_SCHEDULE -g $(filter-out %.h,$^) -o $@ $(LIBHALIDE_LDFLAGS) $(HALIDE_SYSTEM_LIBS) - -# This is the target you build to (re)generate the schedule file. -# (Note that we only need the schedule output, so we pass `-e schedule` to -# the Generator so that it can skip producing other outputs.) -$(BIN)/%/included_schedule_file.schedule.h: $(GENERATOR_BIN)/included_schedule_file_none.generator $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) - @mkdir -p $(@D) - $< -g included_schedule_file -o $(@D) -f included_schedule_file target=$* \ - autoscheduler=Adams2019 \ - autoscheduler.parallelism=32 \ - autoscheduler.weights_path=$(SRC)/baseline.weights \ - -p $(BIN)/libautoschedule_adams2019.$(PLUGIN_EXT) -e schedule - -# Note that this depends on included_schedule_file.schedule.h rather than $(BIN)/%/included_schedule_file.schedule.h -- -# the former should be generated by something like -# -# make bin/host/included_schedule_file.schedule.h -# cp bin/host/included_schedule_file.schedule.h included_schedule_file.schedule.h -# -$(GENERATOR_BIN)/included_schedule_file.generator: $(SRC)/included_schedule_file_generator.cpp $(SRC)/included_schedule_file.schedule.h $(GENERATOR_DEPS) - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) $(USE_EXPORT_DYNAMIC) -g $(filter-out %.h,$^) -o $@ $(LIBHALIDE_LDFLAGS) $(HALIDE_SYSTEM_LIBS) - -# Note that this does not depend on libauto_schedule nor does it call -# the autoscheduler at build time; it includes the generated schedule (included_schedule_file.schedule.h), -# which has been added to our local source control. -$(BIN)/%/included_schedule_file.a: $(GENERATOR_BIN)/included_schedule_file.generator - @mkdir -p $(@D) - $< -g included_schedule_file -o $(@D) -f included_schedule_file target=$* - -$(BIN)/%/included_schedule_file.rungen: $(BIN)/%/RunGenMain.o $(BIN)/%/included_schedule_file.registration.cpp $(BIN)/%/included_schedule_file.a - @mkdir -p $(@D) - $(CXX) $(CXXFLAGS) -I$(BIN)/$* $^ -o $@ $(HALIDE_SYSTEM_LIBS) $(IMAGE_IO_FLAGS) - -test_included_schedule_file: $(BIN)/$(HL_TARGET)/included_schedule_file.rungen - $^ --benchmarks=all --benchmark_min_time=1 --estimate_all diff --git a/test/autoschedulers/CMakeLists.txt b/test/autoschedulers/CMakeLists.txt index f81782308e78..302ea6489378 100644 --- a/test/autoschedulers/CMakeLists.txt +++ b/test/autoschedulers/CMakeLists.txt @@ -1,2 +1,3 @@ +add_subdirectory(adams2019) add_subdirectory(li2018) add_subdirectory(mullapudi2016) diff --git a/test/autoschedulers/adams2019/CMakeLists.txt b/test/autoschedulers/adams2019/CMakeLists.txt new file mode 100644 index 000000000000..8cec08754651 --- /dev/null +++ b/test/autoschedulers/adams2019/CMakeLists.txt @@ -0,0 +1,84 @@ +if (NOT TARGET Halide::Adams2019) + message(STATUS "Disabling adams2019 tests for static Halide") + return() +endif () + +## +# Build rules for the Adams2019 autoscheduler library +## + +function(add_adams2019_test NAME) + set(options "") + set(oneValueArgs ENVIRONMENT) + set(multiValueArgs COMMAND LABELS) + cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT ARGS_COMMAND) + set(ARGS_COMMAND ${NAME}) + endif() + + if (NOT ARGS_LABELS) + set(ARGS_LABELS "") + endif() + list(APPEND ARGS_LABELS adams2019) + list(APPEND ARGS_LABELS autoschedulers) + + add_test(NAME ${NAME} + COMMAND ${ARGS_COMMAND}) + set_tests_properties(${NAME} + PROPERTIES + LABELS "${ARGS_LABELS}" + ENVIRONMENT "${ENVIRONMENT}") +endfunction() + + +## +# Tests and demos +# TODO(#4053): move these to a separate folder since they're tests. +## + +# ================================================================= + +add_halide_generator(adams2019_demo.generator + SOURCES demo_generator.cpp) + +add_halide_library(adams2019_demo FROM adams2019_demo.generator + GENERATOR demo + TARGETS cmake + AUTOSCHEDULER Halide::Adams2019 + REGISTRATION DEMO_REGISTRATION_FILE) + +add_executable(adams2019_demo_apps_autoscheduler ${DEMO_REGISTRATION_FILE}) +target_link_libraries(adams2019_demo_apps_autoscheduler PRIVATE adams2019_demo Halide::RunGenMain) + +add_adams2019_test(adams2019_demo_apps_autoscheduler + COMMAND adams2019_demo_apps_autoscheduler --benchmarks=all --benchmark_min_time=1 --estimate_all) + +# ================================================================= + +add_halide_generator(adams2019_included_schedule_file.generator + SOURCES included_schedule_file_generator.cpp) + +add_halide_library(adams2019_included_schedule_file FROM adams2019_included_schedule_file.generator + GENERATOR included_schedule_file + TARGETS cmake + AUTOSCHEDULER Halide::Adams2019 + REGISTRATION adams2019_included_schedule_reg) + +add_executable(adams2019_demo_included_schedule_file ${adams2019_included_schedule_reg}) +target_link_libraries(adams2019_demo_included_schedule_file PRIVATE adams2019_included_schedule_file Halide::RunGenMain) + +add_adams2019_test(adams2019_demo_included_schedule_file + COMMAND adams2019_demo_included_schedule_file --benchmarks=all --benchmark_min_time=1 --estimate_all) + +# ================================================================= +# Smaller tests + +add_executable(adams2019_test_apps_autoscheduler test.cpp) +target_link_libraries(adams2019_test_apps_autoscheduler PRIVATE Halide::Halide Halide::Tools ${CMAKE_DL_LIBS}) + +add_adams2019_test(adams2019_test_apps_autoscheduler + COMMAND adams2019_test_apps_autoscheduler $ $/baseline.weights + LABELS multithreaded + ENVIRONMENT "LD_LIBRARY_PATH=$:$ENV{LD_LIBRARY_PATH}") + diff --git a/src/autoschedulers/adams2019/demo_generator.cpp b/test/autoschedulers/adams2019/demo_generator.cpp similarity index 100% rename from src/autoschedulers/adams2019/demo_generator.cpp rename to test/autoschedulers/adams2019/demo_generator.cpp diff --git a/src/autoschedulers/adams2019/included_schedule_file.schedule.h b/test/autoschedulers/adams2019/included_schedule_file.schedule.h similarity index 100% rename from src/autoschedulers/adams2019/included_schedule_file.schedule.h rename to test/autoschedulers/adams2019/included_schedule_file.schedule.h diff --git a/src/autoschedulers/adams2019/included_schedule_file_generator.cpp b/test/autoschedulers/adams2019/included_schedule_file_generator.cpp similarity index 100% rename from src/autoschedulers/adams2019/included_schedule_file_generator.cpp rename to test/autoschedulers/adams2019/included_schedule_file_generator.cpp diff --git a/src/autoschedulers/adams2019/test.cpp b/test/autoschedulers/adams2019/test.cpp similarity index 100% rename from src/autoschedulers/adams2019/test.cpp rename to test/autoschedulers/adams2019/test.cpp