1#include "taichi/rhi/arch.h"
2
3namespace taichi {
4
5std::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
19Arch 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.
37bool 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
46bool arch_is_cuda(Arch arch) {
47 return arch == Arch::cuda;
48}
49
50bool 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
55bool arch_is_gpu(Arch arch) {
56 return !arch_is_cpu(arch);
57}
58
59bool arch_uses_spirv(Arch arch) {
60 return arch == Arch::opengl || arch == Arch::vulkan || arch == Arch::dx11;
61}
62
63Arch 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
73bool arch_use_host_memory(Arch arch) {
74 return arch_is_cpu(arch);
75}
76
77int 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