Skip to content

Commit e8fd57b

Browse files
authored
[Example] Factorize cpp examples into separate executables (#8709)
Issue: # ### Brief Summary Factorize cpp examples into separate executables: - cpp_examples_run_snode - cpp_examples_autograd - cpp_examples_aot_save The benefit is that then we can run each example on its own, and easily add new examples. Also: - replace `Arch::x64` with `host_arch()` - run aot_save once for cpu, then once for vulkan, if available; and once for dx12, if available copilot:summary ### Walkthrough copilot:walkthrough
1 parent 562e05f commit e8fd57b

File tree

5 files changed

+55
-70
lines changed

5 files changed

+55
-70
lines changed

cmake/TaichiExamples.cmake

Lines changed: 38 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,48 @@
11
cmake_minimum_required(VERSION 3.0)
22

3-
set(EXAMPLES_NAME taichi_cpp_examples)
4-
5-
file(GLOB_RECURSE TAICHI_EXAMPLES_SOURCE
6-
"cpp_examples/main.cpp"
7-
"cpp_examples/run_snode.cpp"
8-
"cpp_examples/autograd.cpp"
9-
"cpp_examples/aot_save.cpp"
10-
)
11-
12-
add_executable(${EXAMPLES_NAME} ${TAICHI_EXAMPLES_SOURCE})
13-
if (WIN32)
3+
function(add_taichi_example NAME)
4+
set(TARGET_NAME "cpp_examples_${NAME}")
5+
set(SOURCE_FILE "cpp_examples/${NAME}.cpp")
6+
add_executable(${TARGET_NAME} ${SOURCE_FILE})
7+
if (WIN32)
148
# Output the executable to build/ instead of build/Debug/...
15-
set(EXAMPLES_OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build")
16-
set_target_properties(${EXAMPLES_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXAMPLES_OUTPUT_DIR})
17-
set_target_properties(${EXAMPLES_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${EXAMPLES_OUTPUT_DIR})
18-
set_target_properties(${EXAMPLES_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${EXAMPLES_OUTPUT_DIR})
19-
set_target_properties(${EXAMPLES_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${EXAMPLES_OUTPUT_DIR})
20-
set_target_properties(${EXAMPLES_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${EXAMPLES_OUTPUT_DIR})
21-
endif()
22-
23-
target_link_libraries(${EXAMPLES_NAME} PRIVATE taichi_core)
24-
25-
if (TI_WITH_METAL)
26-
target_link_libraries(${EXAMPLES_NAME} PRIVATE
9+
set(TARGET_OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/build")
10+
set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TARGET_OUTPUT_DIR})
11+
set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TARGET_OUTPUT_DIR})
12+
set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TARGET_OUTPUT_DIR})
13+
set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${TARGET_OUTPUT_DIR})
14+
set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${TARGET_OUTPUT_DIR})
15+
endif()
16+
target_link_libraries(${TARGET_NAME} PRIVATE taichi_core)
17+
target_include_directories(${TARGET_NAME}
18+
PRIVATE
19+
${PROJECT_SOURCE_DIR}
20+
${PROJECT_SOURCE_DIR}/external/spdlog/include
21+
${PROJECT_SOURCE_DIR}/external/eigen
22+
)
23+
if (TI_WITH_METAL)
24+
target_link_libraries(${TARGET_NAME} PRIVATE
2725
metal_program_impl
2826
)
29-
endif()
27+
endif()
3028

31-
if (TI_WITH_VULKAN OR TI_WITH_OPENGL OR TI_WITH_METAL)
32-
target_link_libraries(${EXAMPLES_NAME} PRIVATE gfx_runtime)
33-
endif()
29+
if (TI_WITH_VULKAN OR TI_WITH_OPENGL OR TI_WITH_METAL)
30+
target_link_libraries(${TARGET_NAME} PRIVATE gfx_runtime)
31+
endif()
3432

35-
if (TI_WITH_VULKAN)
36-
target_link_libraries(${EXAMPLES_NAME} PRIVATE vulkan_rhi)
37-
endif()
33+
if (TI_WITH_VULKAN)
34+
target_link_libraries(${TARGET_NAME} PRIVATE vulkan_rhi)
35+
endif()
3836

39-
if (TI_WITH_OPENGL)
40-
target_link_libraries(${EXAMPLES_NAME} PRIVATE opengl_rhi)
41-
endif()
37+
if (TI_WITH_OPENGL)
38+
target_link_libraries(${TARGET_NAME} PRIVATE opengl_rhi)
39+
endif()
4240

43-
if (TI_WITH_METAL)
44-
target_link_libraries(${EXAMPLES_NAME} PRIVATE metal_rhi)
45-
endif()
41+
if (TI_WITH_METAL)
42+
target_link_libraries(${TARGET_NAME} PRIVATE metal_rhi)
43+
endif()
44+
endfunction()
4645

47-
# TODO 4832: be specific on the header dependencies here, e.g., ir
48-
target_include_directories(${EXAMPLES_NAME}
49-
PRIVATE
50-
${PROJECT_SOURCE_DIR}
51-
${PROJECT_SOURCE_DIR}/external/spdlog/include
52-
${PROJECT_SOURCE_DIR}/external/eigen
53-
)
46+
add_taichi_example(run_snode)
47+
add_taichi_example(autograd)
48+
add_taichi_example(aot_save)

cpp_examples/aot_save.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
#include "taichi/ir/ir_builder.h"
22
#include "taichi/ir/statements.h"
33
#include "taichi/program/program.h"
4+
using namespace taichi;
5+
using namespace lang;
46

5-
void aot_save(taichi::Arch arch) {
6-
using namespace taichi;
7-
using namespace lang;
8-
7+
void run_aot(taichi::Arch arch) {
98
default_compile_config.advanced_optimization = false;
109
auto program = Program(arch);
1110

@@ -77,3 +76,13 @@ void aot_save(taichi::Arch arch) {
7776
aot_builder->dump(".", taichi::arch_name(arch) + "_aot.tcb");
7877
std::cout << "done" << std::endl;
7978
}
79+
80+
int main() {
81+
run_aot(host_arch());
82+
#ifdef TI_WITH_VULKAN
83+
run_aot(taichi::Arch::vulkan);
84+
#endif
85+
#ifdef TI_WITH_DX12
86+
run_aot(Arch::dx12);
87+
#endif
88+
}

cpp_examples/autograd.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "taichi/ir/statements.h"
33
#include "taichi/program/program.h"
44

5-
void autograd() {
5+
int main() {
66
/*
77
import taichi as ti, numpy as np
88
ti.init()
@@ -41,7 +41,7 @@ void autograd() {
4141
using namespace taichi;
4242
using namespace lang;
4343

44-
auto program = Program(Arch::x64);
44+
auto program = Program(host_arch());
4545
const auto &config = program.compile_config();
4646

4747
int n = 10;

cpp_examples/main.cpp

Lines changed: 0 additions & 19 deletions
This file was deleted.

cpp_examples/run_snode.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "taichi/ir/statements.h"
33
#include "taichi/program/program.h"
44

5-
void run_snode() {
5+
int main() {
66
/*
77
import taichi as ti, numpy as np
88
ti.init()
@@ -39,7 +39,7 @@ void run_snode() {
3939

4040
using namespace taichi;
4141
using namespace lang;
42-
auto program = Program(Arch::x64);
42+
auto program = Program(host_arch());
4343
const auto &config = program.compile_config();
4444
/*CompileConfig config_print_ir;
4545
config_print_ir.print_ir = true;

0 commit comments

Comments
 (0)