[Hexagon] Add support for v73, make v68 default (#14965)
* [Hexagon] Add support for v73, make v68 default
Snapdragon 8 Gen2 is v73, Hexagon SDK 5.2+ supports it.
* Guard CPU versions with #ifdefs
The CPU version constants are enums, but they are initialized with values
that are #defined in HexagonVersions.h. Before using any HEX_CPU_Vxx,
check if the corresponding initializer has been #defined.
diff --git a/apps/hexagon_launcher/README.md b/apps/hexagon_launcher/README.md
index 943a626..8a1db1b 100644
--- a/apps/hexagon_launcher/README.md
+++ b/apps/hexagon_launcher/README.md
@@ -43,10 +43,10 @@
following variables set:
```
-cmake -DCMAKE_C_COMPILER=/path/to/hexagon-clang \
+cmake -DCMAKE_C_COMPILER=/path/to/hexagon-clang \
-DCMAKE_CXX_COMPILER=/path/to/hexagon-clang++ \
- -DUSE_HEXAGON_ARCH=v65|v66|v68|v69 \
- -DUSE_HEXAGON_SDK=/path/to/hexagon/SDK \
+ -DUSE_HEXAGON_ARCH=v65|v66|v68|v69|v73 \
+ -DUSE_HEXAGON_SDK=/path/to/hexagon/SDK \
/path/to/apps/hexagon_launcher/cmake/hexagon
```
@@ -60,10 +60,10 @@
```
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/android-ndk/build/cmake/android.toolchain.cmake \
- -DANDROID_ABI=arm64-v8a \
- -DANDROID_PLATFORM=android-28 \
- -DUSE_HEXAGON_SDK=/p/Hexagon_SDK/4.3.0.0
- -DUSE_HEXAGON_ARCH=v65|v66|v68|v69
+ -DANDROID_ABI=arm64-v8a \
+ -DANDROID_PLATFORM=android-28 \
+ -DUSE_HEXAGON_SDK=/p/Hexagon_SDK/4.3.0.0 \
+ -DUSE_HEXAGON_ARCH=v65|v66|v68|v69|v73 \
/path/to/apps/hexagon_launcher/cmake/android
```
diff --git a/cmake/config.cmake b/cmake/config.cmake
index 2ccb281..8a7a0f1 100644
--- a/cmake/config.cmake
+++ b/cmake/config.cmake
@@ -331,8 +331,8 @@
# compiling _by_ TVM). This applies to components like the TVM runtime, but is
# also used to select correct include/library paths from the Hexagon SDK when
# building runtime for Android.
-# Valid values are v65, v66, v68, v69.
-set(USE_HEXAGON_ARCH "v66")
+# Valid values are v65, v66, v68, v69, v73.
+set(USE_HEXAGON_ARCH "v68")
# Whether to use QHL library
set(USE_HEXAGON_QHL OFF)
diff --git a/cmake/modules/HexagonSDK.cmake b/cmake/modules/HexagonSDK.cmake
index ddb158c..e74898a 100644
--- a/cmake/modules/HexagonSDK.cmake
+++ b/cmake/modules/HexagonSDK.cmake
@@ -107,12 +107,13 @@
set(_hexarch_dir_v65 "computev65")
set(_hexarch_dir_v66 "computev66")
set(_hexarch_dir_v68 "computev68")
- set(_hexarch_dir_v69 "computev68") # Use computev68 for v69
+ set(_hexarch_dir_v69 "computev69")
+ set(_hexarch_dir_v73 "computev73")
set(_hexarch_dir_str "_hexarch_dir_${_hexagon_arch}")
set(_hexarch_dir "${${_hexarch_dir_str}}")
if(NOT _hexarch_dir)
- message(SEND_ERROR "Please set Hexagon architecture to one of v65, v66, v68, v69")
+ message(SEND_ERROR "Please set Hexagon architecture to one of v65, v66, v68, v69, v73")
endif()
if(_property STREQUAL "VERSION")
diff --git a/python/tvm/contrib/hexagon/tools.py b/python/tvm/contrib/hexagon/tools.py
index d75df71..1753112 100644
--- a/python/tvm/contrib/hexagon/tools.py
+++ b/python/tvm/contrib/hexagon/tools.py
@@ -90,7 +90,7 @@
objs : list[str,StringImm]
extra_args : dict (str->str) or Map<String,String>
Additional arguments:
- 'hex_arch' - Hexagon architecture, e.g. v66
+ 'hex_arch' - Hexagon architecture, e.g. v68
'verbose' - Print additional information if the key is present
Returns
@@ -110,7 +110,7 @@
if not extra_args:
extra_args = {}
- hex_arch = extra_args.get("hex_arch") or "v66"
+ hex_arch = extra_args.get("hex_arch") or "v68"
linker = tvm.get_global_func("tvm.contrib.hexagon.hexagon_link")()
if extra_args.get("verbose"):
print("tvm.contrib.hexagon.link_shared:")
@@ -161,7 +161,7 @@
objs : list[str,StringImm]
extra_args : dict (str->str) or Map<String,String>
Additional arguments:
- 'hex_arch' - Hexagon architecture, e.g. v66
+ 'hex_arch' - Hexagon architecture, e.g. v68
Returns
-------
@@ -180,7 +180,7 @@
if not extra_args:
extra_args = {}
- hex_arch = extra_args.get("hex_arch") or "v66"
+ hex_arch = extra_args.get("hex_arch") or "v68"
ses = ContainerSession(HEXAGON_SDK_DOCKER_IMAGE)
diff --git a/python/tvm/target/target.py b/python/tvm/target/target.py
index fce9f3e..0c834c5 100644
--- a/python/tvm/target/target.py
+++ b/python/tvm/target/target.py
@@ -646,12 +646,12 @@
return Target(" ".join(["llvm"] + opts))
-def hexagon(cpu_ver="v66", **kwargs):
+def hexagon(cpu_ver="v68", **kwargs):
"""Returns a Hexagon target.
Parameters
----------
- cpu_ver : str (default: "v66")
+ cpu_ver : str (default: "v68")
CPU version used for code generation. Not all allowed cpu str
will be valid, LLVM will throw an error.
@@ -679,7 +679,7 @@
# in place of '-'.
# Example compiler arguments
- # llvm -mtriple=hexagon -mcpu=hexagonv66 -mattr=+hvxv66,+hvx-length128b
+ # llvm -mtriple=hexagon -mcpu=hexagonv68 -mattr=+hvxv68,+hvx-length128b
def get_arch_version(cpu_ver):
m = re.match(r"v([0-9]+).*", cpu_ver)
@@ -687,7 +687,7 @@
return int(m.group(1))
# Check for valid codegen cpu
- valid_hex = ["v65", "v66", "v67", "v67t", "v68", "v69"]
+ valid_hex = ["v65", "v66", "v67", "v67t", "v68", "v69", "v71", "v73"]
try:
cpu_ver = cpu_ver[cpu_ver.index("v") :].lower()
assert cpu_ver in valid_hex
diff --git a/src/runtime/hexagon/README.md b/src/runtime/hexagon/README.md
index 7e19105..118c727 100644
--- a/src/runtime/hexagon/README.md
+++ b/src/runtime/hexagon/README.md
@@ -54,7 +54,7 @@
ANDROID_PLATFORM=android-28
CMAKE_TOOLCHAIN_FILE=/path/to/android-ndk/build/cmake/android.toolchain.cmake
USE_HEXAGON=ON
-USE_HEXAGON_ARCH=v65|v66|v68|v69
+USE_HEXAGON_ARCH=v65|v66|v68|v69|v73
USE_HEXAGON_SDK=/path/to/sdk
```
@@ -63,8 +63,11 @@
CMAKE_C_COMPILER=hexagon-clang
CMAKE_CXX_COMPILER=hexagon-clang++
USE_HEXAGON=ON
-USE_HEXAGON_ARCH=v65|v66|v68|v69
+USE_HEXAGON_ARCH=v65|v66|v68|v69|v73
USE_HEXAGON_SDK=/path/to/sdk
```
As mentioned before, only build the `runtime` component (e.g. `make runtime`).
+
+Please note that the Hexagon SDK version needs to support the architecture
+specified in `USE_HEXAGON_ARCH`.
diff --git a/src/runtime/hexagon/rpc/simulator/session.cc b/src/runtime/hexagon/rpc/simulator/session.cc
index a7f7896..6a805b0 100644
--- a/src/runtime/hexagon/rpc/simulator/session.cc
+++ b/src/runtime/hexagon/rpc/simulator/session.cc
@@ -434,14 +434,30 @@
std::string SimulatorRPCChannel::Cpu_::str() const {
switch (c) {
+#ifdef HEX_CPU_ID_V65A_512
case HEX_CPU_V65:
return "v65";
+#endif
+#ifdef HEX_CPU_ID_V66A_512
case HEX_CPU_V66:
return "v66";
+#endif
+#ifdef HEX_CPU_ID_V68N_1024
case HEX_CPU_V68:
return "v68";
+#endif
+#ifdef HEX_CPU_ID_V69NA
case HEX_CPU_V69:
return "v69";
+#endif
+#ifdef HEX_CPU_ID_V71H_MDM_SCA
+ case HEX_CPU_V71:
+ return "v71";
+#endif
+#ifdef HEX_CPU_ID_V73NA_1
+ case HEX_CPU_V73:
+ return "v73";
+#endif
default:
break;
}
@@ -541,10 +557,24 @@
std::optional<HEXAPI_Cpu> SimulatorRPCChannel::GetCPU(const detail::MaybeString& cpu_str) {
if (!cpu_str) return std::nullopt;
return detail::StringSwitch<std::optional<HEXAPI_Cpu>>(*cpu_str)
+#ifdef HEX_CPU_ID_V65A_512
.Case("v65", HEX_CPU_V65)
+#endif
+#ifdef HEX_CPU_ID_V66A_512
.Case("v66", HEX_CPU_V66)
+#endif
+#ifdef HEX_CPU_ID_V68N_1024
.Case("v68", HEX_CPU_V68)
+#endif
+#ifdef HEX_CPU_ID_V69NA
.Case("v69", HEX_CPU_V69)
+#endif
+#ifdef HEX_CPU_ID_V71H_MDM_SCA
+ .Case("v71", HEX_CPU_V71)
+#endif
+#ifdef HEX_CPU_ID_V73NA_1
+ .Case("v73", HEX_CPU_V73)
+#endif
.Default(std::nullopt);
}
diff --git a/tests/python/contrib/test_hexagon/README.md b/tests/python/contrib/test_hexagon/README.md
index 665ff9a..d3698b6 100644
--- a/tests/python/contrib/test_hexagon/README.md
+++ b/tests/python/contrib/test_hexagon/README.md
@@ -49,7 +49,7 @@
cmake -DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-28 \
-DUSE_ANDROID_TOOLCHAIN="path to `android-ndk/build/cmake/android.toolchain.cmake` file" \
- -DUSE_HEXAGON_ARCH=v65|v66|v68|v69 \
+ -DUSE_HEXAGON_ARCH=v65|v66|v68|v69|v73 \
-DUSE_HEXAGON_SDK="path to Hexagon SDK" \
-DUSE_HEXAGON_TOOLCHAIN="path to Hexagon toolchain `Tools` sub-directory which explained above" \
-DUSE_OUTPUT_BINARY_DIR="path to `build/hexagon_api_output` which is a sub-directory of `tvm`" ..