1 | #include "taichi/rhi/arch.h" |
---|---|
2 | |
3 | namespace taichi { |
4 | |
5 | std::string arch_name(Arch arch) { |
6 | switch (arch) { |
7 | #define PER_ARCH(x) \ |
8 | case Arch::x: \ |
9 | return #x; \ |
10 | break; |
11 | #include "taichi/inc/archs.inc.h" |
12 | |
13 | #undef PER_ARCH |
14 | default: |
15 | TI_NOT_IMPLEMENTED |
16 | } |
17 | } |
18 | |
19 | Arch arch_from_name(const std::string &arch_name) { |
20 | #define PER_ARCH(x) \ |
21 | else if (arch_name == #x) { \ |
22 | return Arch::x; \ |
23 | } |
24 | |
25 | if (false) { |
26 | } |
27 | #include "taichi/inc/archs.inc.h" |
28 | |
29 | else { |
30 | TI_ERROR("Unknown architecture name: {}", arch_name); |
31 | } |
32 | |
33 | #undef PER_ARCH |
34 | } |
35 | |
36 | // Assuming a processor is either a CPU or a GPU. DSP/TPUs not considered. |
37 | bool arch_is_cpu(Arch arch) { |
38 | if (arch == Arch::x64 || arch == Arch::arm64 || arch == Arch::js || |
39 | arch == Arch::wasm) { |
40 | return true; |
41 | } else { |
42 | return false; |
43 | } |
44 | } |
45 | |
46 | bool arch_is_cuda(Arch arch) { |
47 | return arch == Arch::cuda; |
48 | } |
49 | |
50 | bool arch_uses_llvm(Arch arch) { |
51 | return (arch == Arch::x64 || arch == Arch::arm64 || arch == Arch::cuda || |
52 | arch == Arch::dx12 || arch == Arch::wasm || arch == Arch::amdgpu); |
53 | } |
54 | |
55 | bool arch_is_gpu(Arch arch) { |
56 | return !arch_is_cpu(arch); |
57 | } |
58 | |
59 | bool arch_uses_spirv(Arch arch) { |
60 | return arch == Arch::opengl || arch == Arch::vulkan || arch == Arch::dx11; |
61 | } |
62 | |
63 | Arch host_arch() { |
64 | #if defined(TI_ARCH_x64) |
65 | return Arch::x64; |
66 | #endif |
67 | #if defined(TI_ARCH_ARM) |
68 | return Arch::arm64; |
69 | #endif |
70 | TI_NOT_IMPLEMENTED |
71 | } |
72 | |
73 | bool arch_use_host_memory(Arch arch) { |
74 | return arch_is_cpu(arch); |
75 | } |
76 | |
77 | int default_simd_width(Arch arch) { |
78 | if (arch == Arch::x64) { |
79 | return 8; |
80 | } else if (arch == Arch::cuda) { |
81 | return 32; |
82 | } else if (arch == Arch::arm64) { |
83 | return 4; |
84 | } else { |
85 | TI_NOT_IMPLEMENTED; |
86 | return -1; |
87 | } |
88 | } |
89 | |
90 | } // namespace taichi |
91 |