apache / apache/tvm

[Bug] [RISC-V RVV] sqrt operator shows poor vectorization performance

Open
#18,564 0 comments 0 reactions 0 assignees View on GitHub
needs-triage type: bug
Dominant language
Python
Stars
13.7k
Forks
4k
Avg merge
2d 1h
Merged PRs (30d)
112

Description

### Issue: [RISC-V RVV] sqrt operator shows poor vectorization performance

#### Description
The sqrt (square root) operator performs poorly with the RISC‑V Vector (RVV) extension, achieving only 0.385× the performance of the scalar implementation. This is unexpected for a mathematical function that should see significant benefits from vectorization.

#### Steps to Reproduce
1. Generate the sqrt operator with the following configuration:
```python
params = {
"dtype": "float32",
"batch": 14,
"channels": 23,
"input_height": 67,
"input_width": 99
}
```

2. Export the operator to two targets:
- **RV target** (scalar, without vector extension):
```
llvm -mtriple=riscv64-linux-gnu -mcpu=generic-rv64 -mabi=lp64d -mattr=+64bit,+m,+a,+f,+d,+c
```
- **RVV target** (with vector extension):
```
llvm -mtriple=riscv64-linux-gnu -mcpu=generic-rv64 -mabi=lp64d -mattr=+64bit,+m,+a,+f,+d,+c,+v
```

3. Run performance measurement on both targets.

Operator definition code:
```python
def export_sqrt(params, set_dir=None, platform="rv"):
data = relay.var("data",
shape=(params["batch"], params["channels"],
params["input_height"], params["input_width"]),
dtype=params["dtype"])
sqrt_op = relay.sqrt(data)
export_op(sqrt_op, params["op_name"], [data], params, set_dir=set_dir)
```

#### Performance Data
- **RV execution time**: 11.502000 ms
- **RVV execution time**: 29.906500 ms
- **Acceleration ratio (RV/RVV)**: 0.385 (RVV is ~2.6× slower)

#### Environment Information
- **TVM version**: 0.19.0
- **LLVM version**: [Please provide: `llvm-config --version`]
- **Hardware**: Spacemit K1‑X bit‑brick board
- **CPU**: Spacemit X60 (8 cores, 1.6 GHz)
- **ISA**: rv64imafdcv (with vector extensions)
- **Memory**: 7.6 GB
- **OS**: Bianbu 2.2, Linux kernel 6.6.63
- **Operation**: Elementwise square root on ~1.7M elements

#### Expected Behavior
RVV vectorization should provide a performance improvement over the scalar RV baseline for mathematical functions like square root.

#### Additional Context
- The sqrt operation is applied elementwise to a tensor of ~1.7M elements.
- The performance regression (2.6× slower) suggests that the vectorized implementation of sqrt may be using suboptimal instructions or inefficient vector length management.
- This is part of a broader pattern where multiple mathematical operators (log, sqrt, etc.) show severe performance degradation with RVV, indicating a potential issue with vector intrinsic mapping or loop vectorization for transcendental functions.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the provided Python sqrt export and reproduce the RV versus RVV benchmark using the stated tensor shape and target flags. Compare the generated scalar and vector code, then inspect the RVV handling of sqrt, vector intrinsic mapping, and vector-length management. Done means identifying and correcting the cause of the regression and confirming that RVV outperforms the scalar baseline on the benchmark.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
compilers, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.