Eigen RVV
Eigen 简介
Eigen 是一个高性能的 C++ 模板库,专用于线性代数运算,涵盖矩阵、向量、数值求解及相关算法。它被广泛应用于机器人、计算机视觉、数值仿真等领域,是 ROS、OpenCV、PCL 等主流框架的核心依赖之一。
主要特点:
- 纯头文件:无需编译,直接
#include即可使用 - 高性能:通过表达式模板(expression templates)消除临时变量,自动向量化(SIMD)
- 功能丰富:支持稠密矩阵、稀疏矩阵、几何变换(旋转矩阵、四元数)、线性求解器等
- 跨平台:支持 x86、ARM、RISC-V 等主流架构
RVV 加速
RVV(RISC-V Vector Extension)是 RISC-V 架构的向量扩展指令集,可对矩阵运算进行 SIMD 加速。K3 搭载的 SpacemiT X100 + A100 16 核处理器原生支持 RVV 1.0(含 zve64d、zvfh 等向量子扩展)。
针对 K3 平台,我们提供了专为 RVV 优化的定制 Eigen 库 eigen-spacemit,相比系统默认的 Eigen 有显著差异:
| 对比项 | 系统 Eigen(libeigen3-dev) | eigen-spacemit |
|---|---|---|
| 安装路径 | /usr/include/eigen3 | /opt/eigen-spacemit |
| RVV 加速 | 未启用 | 针对 RVV 1.0 优化 |
| 适用平台 | 通用(x86/ARM/RISC-V) | 专为 SpacemiT X100 定制 |
| 安装方式 | apt install libeigen3-dev | apt install eigen-spacemit |
在 K3 上进行高性能线性代数运算(如点云处理、SLAM、卡尔曼滤波)时,推荐优先使用 eigen-spacemit 以充分发挥 RVV 硬件能力。
使用示例
以下示例对比系统 Eigen 与 eigen-spacemit 在 512×512 矩阵乘法上的性能差异。
安装必要依赖
sudo apt update
sudo apt install eigen-spacemit libeigen3-dev
目录结构:
eigen_bench/
├── CMakeLists.txt
└── bench.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(eigen_bench LANGUAGES CXX)
# OpenMP 让 Eigen 支持的单个算子(主要是大矩阵乘法)可以使用多线程。
option(EIGEN_BENCH_ENABLE_OPENMP "Enable OpenMP so Eigen can parallelize supported operators" ON)
# RVV 编译参数。
set(RVV_MARCH "rv64gcv_zvl256b" CACHE STRING "RISC-V architecture flags for RVV builds")
set(RVV_MABI "lp64d" CACHE STRING "RISC-V ABI flags for RVV builds")
# 系统 Eigen 对照组保持无 RVV,需显式指定标量目标架构和 ABI。
set(SCALAR_MARCH "rv64gc" CACHE STRING "RISC-V architecture flags for scalar non-RVV builds")
set(SCALAR_MABI "lp64d" CACHE STRING "RISC-V ABI flags for scalar non-RVV builds")
if(EIGEN_BENCH_ENABLE_OPENMP)
find_package(OpenMP)
endif()
# 统一创建 benchmark 目标:传入不同 Eigen include 路径即可对比不同实现。
function(add_bench target eigen_include)
add_executable(${target} bench.cpp)
target_include_directories(${target} PRIVATE "${eigen_include}")
target_compile_options(${target} PRIVATE -O3 -DNDEBUG -std=c++17)
if(EIGEN_BENCH_ENABLE_OPENMP AND OpenMP_CXX_FOUND)
target_link_libraries(${target} PRIVATE OpenMP::OpenMP_CXX)
endif()
endfunction()
# SpacemiT Eigen(RVV 加速)
add_bench(bench_spacemit /opt/eigen-spacemit/include/eigen3)
target_compile_options(bench_spacemit PRIVATE -march=${RVV_MARCH} -mabi=${RVV_MABI} -mrvv-vector-bits=zvl)
target_compile_definitions(bench_spacemit PRIVATE EIGEN_RISCV64_USE_RVV10)
# 系统 Eigen(无 RVV)
add_bench(bench_system /usr/include/eigen3)
target_compile_options(bench_system PRIVATE -march=${SCALAR_MARCH} -mabi=${SCALAR_MABI})
bench.cpp:
#include <Eigen/Dense>
#include <chrono>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <string>
namespace {
int parsePositiveInt(const char* value, const std::string& name) {
const int parsed = std::stoi(value);
if (parsed <= 0) {
throw std::runtime_error(name + " must be positive");
}
return parsed;
}
std::string envOrUnset(const char* name) {
const char* value = std::getenv(name);
return value ? value : "not_set";
}
} // namespace
int main(int argc, char** argv) {
try {
const int N = argc > 1 ? parsePositiveInt(argv[1], "matrix_size") : 512;
const int iters = argc > 2 ? parsePositiveInt(argv[2], "iterations") : 10;
const char* threads_env = std::getenv("EIGEN_BENCH_THREADS");
const int threads = argc > 3 ? parsePositiveInt(argv[3], "threads") : (threads_env ? parsePositiveInt(threads_env, "EIGEN_BENCH_THREADS") : 8);
Eigen::setNbThreads(threads);
Eigen::MatrixXf A = Eigen::MatrixXf::Random(N, N);
Eigen::MatrixXf B = Eigen::MatrixXf::Random(N, N);
Eigen::MatrixXf C(N, N);
C.noalias() = A * B; // warmup
auto t0 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < iters; ++i)
C.noalias() = A * B;
auto t1 = std::chrono::high_resolution_clock::now();
double ms = std::chrono::duration<double, std::milli>(t1 - t0).count() / iters;
std::cout << "Eigen version: " << EIGEN_WORLD_VERSION << '.' << EIGEN_MAJOR_VERSION << '.' << EIGEN_MINOR_VERSION << '\n';
std::cout << "SimdInstructionSetsInUse(): " << Eigen::SimdInstructionSetsInUse() << '\n';
#ifdef EIGEN_HAS_OPENMP
std::cout << "EIGEN_HAS_OPENMP: defined\n";
#else
std::cout << "EIGEN_HAS_OPENMP: not_defined\n";
#endif
std::cout << "matrix_size: " << N << '\n';
std::cout << "iterations: " << iters << '\n';
std::cout << "requested_threads: " << threads << '\n';
std::cout << "Eigen nbThreads: " << Eigen::nbThreads() << '\n';
std::cout << "OMP_NUM_THREADS: " << envOrUnset("OMP_NUM_THREADS") << '\n';
std::cout << "EIGEN_BENCH_THREADS: " << envOrUnset("EIGEN_BENCH_THREADS") << '\n';
std::cout << N << "x" << N << " matmul avg: " << ms << " ms\n";
return 0;
} catch (const std::exception& error) {
std::cerr << "error: " << error.what() << '\n';
return 1;
}
}
编译与运行:
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
./bench_system # 系统 Eigen
./bench_spacemit # SpacemiT Eigen(RVV)
单核对比

可以看出,RVV加速后的矩阵乘法性能有明显提升(77 ms -> 22 ms)
八核对比

使用 openblas-spacemit 作为后端
Eigen 默认使用自身的模板实现完成矩阵运算,而 OpenBLAS 是一个经过高度优化的 BLAS(Basic Linear Algebra Subprograms)数值库。通过在编译时添加 -DEIGEN_USE_BLAS 宏,Eigen 会将底层的矩阵乘法(gemm)等关键运算委托给 OpenBLAS 执行,从而利用其针对特定硬件深度调优的实现。
openblas-spacemit 是专为 SpacemiT K3 平台定制的 OpenBLAS 版本,充分利用了 RVV 1.0 向量扩展及平台特性。与单独使用 eigen-spacemit(RVV 向量化)相比,通过 openblas-spacemit 后端可以进一步将大规模矩阵乘法性能提升。
安装必要依赖
sudo apt install openblas-spacemit
编译与运行
仍使用上一节的bench.cpp
export LD_LIBRARY_PATH=/opt/openblas-spacemit/lib:$LD_LIBRARY_PATH
g++ -O3 -DNDEBUG -std=c++17 \
-fopenmp \
-march=rv64gcv_zvl256b -mabi=lp64d -mrvv-vector-bits=zvl \
-DEIGEN_RISCV64_USE_RVV10 -DEIGEN_USE_BLAS \
-I"/opt/eigen-spacemit/include/eigen3" \
"bench.cpp" \
"/opt/openblas-spacemit/lib/libopenblas.so" -lpthread \
-o /tmp/eigen_bench_blas
/tmp/eigen_bench_blas
单核性能:

使用 openblas-spacemit 作为 eigen 后端,矩阵乘法的性能还有进一步的提升(22 ms -> 9.48 ms)
八核性能:

更多性能测试数据
测试环境
- SpacemiT RISCV64 X100 CPU(2.4Ghz)
- Bianbu 4.0.1 操作系统
- 内存:32GB
多核测试说明
- 多核测试编译需要
target_link_libraries(${target_name} PRIVATE OpenMP::OpenMP_CXX) - 多核测试代码需要
Eigen::setNbThreads(threads),threads建议与测试时限制的核数一致 - 以下测试
threads与核数均取一致
性能下降情况说明
后续表格中 speedup 小于 1 或 improvement 为负数表示对比方案性能低于基准方案。需要注意的是,这类结果主要集中在以下几类场景:
- 极小规模几何运算:如
Quaternion::inverse()、Quaternion::normalize()、Quaternion::toRotationMatrix()、cross()等输入规模仅为 3x1 或 3x3,单次耗时约 0.0001 ms,已经接近计时分辨率与函数调用开销,少量负收益更多体现为测试抖动或额外分支/向量化开销,不代表大规模计算性能退化。 - 低计算密度或访存主导算子:如
trace()、部分Identity()、block()、transpose()、rowwise().sum()等,计算量较小或内存访问占主导,RVV/BLAS 后端的调度、打包、线程同步等开销可能抵消向量化收益。 - 使用 BLAS 后端时的非 GEMM 算子:
EIGEN_USE_BLAS主要加速大矩阵乘法等 BLAS Level-3 操作;对于大量数组逐元素运算、标量运算、归约或小矩阵操作,调用 BLAS 后端并不会带来直接收益,部分场景会出现 1%~3% 左右的小幅下降,通常属于开销差异或测试波动。 - 多核小算子并行开销:在四核、八核测试中,部分单次计算量较小的算子会受到线程调度、同步和缓存竞争影响,出现比单核更明显的负收益。例如 BLAS 后端对比中,
matrix_gemv、matrix_identity等在多核下存在下降,但大矩阵乘法仍保持显著提升。
因此,性能下降项应结合算子类型、输入规模与标准差一起判断。实际应用中,建议优先将 eigen-spacemit 或 openblas-spacemit 用于矩阵乘法、矩阵分解、求逆、归约等计算密集型任务;对于小尺寸几何操作或访存主导算子,可根据端到端业务耗时进行取舍。
eigen-spacemit VS libeigen3-dev
- 使用 taskset -c 限制核数
- 单次测试的计时策略是每个算子跑 50 次取平均值,预热10次。本测试重复10次单次测试,取其指标的平均值并计算标准差
- mean 表示 10 次测试的均值,sd 为标准差
单核对比
taskset -c 0
threads:1
| module | function | api | dtype | input_size | output_size | libeigen3-dev avg_ms mean±sd | eigen-spacemit avg_ms mean±sd | libeigen3-dev avg_gflops mean±sd | eigen-spacemit avg_gflops mean±sd | speedup mean±sd | improvement mean±sd |
|---|---|---|---|---|---|---|---|---|---|---|---|
| array | vector_abs | abs(a - scalar) | float32 | 262144x1 | 262144x1 | 0.6099 ± 0.0158 | 0.2440 ± 0.0056 | 0.4301 ± 0.0111 | 1.0751 ± 0.0245 | 2.50x ± 0.01x | 149.99% ± 1.37% |
| array | vector_abs | abs(a - scalar) | float64 | 262144x1 | 262144x1 | 0.8122 ± 0.0206 | 0.6826 ± 0.0123 | 0.3229 ± 0.0079 | 0.3842 ± 0.0069 | 1.19x ± 0.03x | 19.00% ± 2.58% |
| array | vector_add_scalar | a + scalar | float32 | 262144x1 | 262144x1 | 0.6101 ± 0.0149 | 0.1996 ± 0.0070 | 0.4299 ± 0.0104 | 1.3147 ± 0.0447 | 3.06x ± 0.05x | 205.77% ± 5.15% |
| array | vector_add_scalar | a + scalar | float64 | 262144x1 | 262144x1 | 0.7155 ± 0.0168 | 0.6065 ± 0.0099 | 0.3666 ± 0.0085 | 0.4324 ± 0.0070 | 1.18x ± 0.02x | 17.99% ± 2.41% |
| array | vector_add_vector | a + b | float32 | 262144x1 | 262144x1 | 0.7388 ± 0.0191 | 0.2521 ± 0.0173 | 0.3550 ± 0.0091 | 1.0443 ± 0.0719 | 2.94x ± 0.21x | 194.30% ± 21.45% |
| array | vector_add_vector | a + b | float64 | 262144x1 | 262144x1 | 1.0307 ± 0.0347 | 0.8972 ± 0.0215 | 0.2546 ± 0.0086 | 0.2923 ± 0.0069 | 1.15x ± 0.04x | 14.91% ± 4.05% |
| array | vector_clamp | cwiseMax + cwiseMin | float32 | 262144x1 | 262144x1 | 0.7360 ± 0.0175 | 0.4418 ± 0.0107 | 0.7127 ± 0.0168 | 1.1872 ± 0.0284 | 1.67x ± 0.00x | 66.58% ± 0.49% |
| array | vector_clamp | cwiseMax + cwiseMin | float64 | 262144x1 | 262144x1 | 0.8870 ± 0.0165 | 1.0334 ± 0.0201 | 0.5913 ± 0.0110 | 0.5075 ± 0.0098 | 0.86x ± 0.01x | -14.17% ± 0.62% |
| array | vector_cos | cos(a) | float32 | 262144x1 | 262144x1 | 5.6887 ± 0.1369 | 2.0954 ± 0.0505 | 0.0461 ± 0.0011 | 0.1252 ± 0.0030 | 2.71x ± 0.01x | 171.49% ± 0.85% |
| array | vector_cos | cos(a) | float64 | 262144x1 | 262144x1 | 10.9408 ± 0.2610 | 10.7751 ± 0.2532 | 0.0240 ± 0.0006 | 0.0244 ± 0.0006 | 1.02x ± 0.00x | 1.54% ± 0.16% |
| array | vector_div_scalar | a / scalar | float32 | 262144x1 | 262144x1 | 1.5860 ± 0.0382 | 0.6609 ± 0.0243 | 0.1654 ± 0.0039 | 0.3972 ± 0.0142 | 2.40x ± 0.04x | 140.11% ± 4.25% |
| array | vector_div_scalar | a / scalar | float64 | 262144x1 | 262144x1 | 2.6190 ± 0.0821 | 2.3817 ± 0.0522 | 0.1002 ± 0.0031 | 0.1101 ± 0.0024 | 1.10x ± 0.02x | 9.95% ± 1.50% |
| array | vector_div_vector | a / (b + scalar) | float32 | 262144x1 | 262144x1 | 1.5903 ± 0.0384 | 0.7656 ± 0.0279 | 0.3299 ± 0.0079 | 0.6856 ± 0.0243 | 2.08x ± 0.05x | 107.85% ± 5.38% |
| array | vector_div_vector | a / (b + scalar) | float64 | 262144x1 | 262144x1 | 2.6453 ± 0.0850 | 2.6033 ± 0.0547 | 0.1984 ± 0.0063 | 0.2015 ± 0.0042 | 1.02x ± 0.02x | 1.60% ± 1.93% |
| array | vector_dot | dot() | float32 | 262144x1 | 1x1 | 0.3717 ± 0.0184 | 0.0981 ± 0.0095 | 1.4133 ± 0.0669 | 5.3871 ± 0.5120 | 3.82x ± 0.37x | 281.66% ± 37.21% |
| array | vector_dot | dot() | float64 | 262144x1 | 1x1 | 0.5054 ± 0.0402 | 0.4009 ± 0.0175 | 1.0430 ± 0.0786 | 1.3098 ± 0.0542 | 1.26x ± 0.10x | 26.15% ± 9.90% |
| array | vector_exp | exp(a * scalar) | float32 | 262144x1 | 262144x1 | 6.7104 ± 0.1583 | 2.1390 ± 0.0716 | 0.0782 ± 0.0018 | 0.2454 ± 0.0080 | 3.14x ± 0.05x | 213.83% ± 4.63% |
| array | vector_exp | exp(a * scalar) | float64 | 262144x1 | 262144x1 | 7.0105 ± 0.1669 | 6.8168 ± 0.1582 | 0.0748 ± 0.0018 | 0.0770 ± 0.0018 | 1.03x ± 0.00x | 2.84% ± 0.25% |
| array | vector_fma | a * b + c | float32 | 262144x1 | 262144x1 | 1.2195 ± 0.0269 | 0.4835 ± 0.0119 | 0.4301 ± 0.0094 | 1.0849 ± 0.0266 | 2.52x ± 0.08x | 152.33% ± 7.97% |
| array | vector_fma | a * b + c | float64 | 262144x1 | 262144x1 | 1.4908 ± 0.0232 | 1.2728 ± 0.0207 | 0.3518 ± 0.0056 | 0.4120 ± 0.0066 | 1.17x ± 0.03x | 17.16% ± 2.95% |
| array | vector_log | log(a + scalar) | float32 | 262144x1 | 262144x1 | 6.4867 ± 0.2051 | 2.0757 ± 0.0702 | 0.0809 ± 0.0025 | 0.2529 ± 0.0083 | 3.13x ± 0.06x | 212.58% ± 6.31% |
| array | vector_log | log(a + scalar) | float64 | 262144x1 | 262144x1 | 7.3730 ± 0.2169 | 6.1661 ± 0.1434 | 0.0712 ± 0.0020 | 0.0851 ± 0.0020 | 1.20x ± 0.01x | 19.56% ± 1.13% |
| array | vector_max | max(a, b) | float32 | 262144x1 | 262144x1 | 0.7613 ± 0.0424 | 0.3161 ± 0.0143 | 0.3452 ± 0.0184 | 0.8309 ± 0.0382 | 2.41x ± 0.15x | 141.16% ± 15.07% |
| array | vector_max | max(a, b) | float64 | 262144x1 | 262144x1 | 1.0221 ± 0.0252 | 0.9173 ± 0.0252 | 0.2566 ± 0.0061 | 0.2860 ± 0.0077 | 1.11x ± 0.04x | 11.49% ± 3.59% |
| array | vector_min | min(a, b) | float32 | 262144x1 | 262144x1 | 0.8580 ± 0.0196 | 0.3150 ± 0.0145 | 0.3057 ± 0.0070 | 0.8340 ± 0.0387 | 2.73x ± 0.10x | 172.79% ± 9.95% |
| array | vector_min | min(a, b) | float64 | 262144x1 | 262144x1 | 1.0048 ± 0.0185 | 0.9050 ± 0.0261 | 0.2610 ± 0.0048 | 0.2899 ± 0.0081 | 1.11x ± 0.03x | 11.08% ± 2.72% |
| array | vector_mul_scalar | a * scalar | float32 | 262144x1 | 262144x1 | 0.7347 ± 0.0213 | 0.2149 ± 0.0076 | 0.3571 ± 0.0101 | 1.2210 ± 0.0418 | 3.42x ± 0.07x | 241.96% ± 6.92% |
| array | vector_mul_scalar | a * scalar | float64 | 262144x1 | 262144x1 | 0.7132 ± 0.0163 | 0.6299 ± 0.0115 | 0.3678 ± 0.0083 | 0.4163 ± 0.0076 | 1.13x ± 0.02x | 13.22% ± 1.93% |
| array | vector_mul_vector | a * b | float32 | 262144x1 | 262144x1 | 0.7392 ± 0.0186 | 0.2642 ± 0.0190 | 0.3548 ± 0.0089 | 0.9968 ± 0.0721 | 2.81x ± 0.21x | 181.07% ± 21.30% |
| array | vector_mul_vector | a * b | float64 | 262144x1 | 262144x1 | 1.0304 ± 0.0253 | 0.9050 ± 0.0334 | 0.2546 ± 0.0063 | 0.2900 ± 0.0106 | 1.14x ± 0.05x | 13.99% ± 4.89% |
| array | vector_norm | norm() | float32 | 262144x1 | 1x1 | 0.3660 ± 0.0096 | 0.0841 ± 0.0023 | 1.4333 ± 0.0373 | 6.2364 ± 0.1713 | 4.35x ± 0.03x | 335.21% ± 2.91% |
| array | vector_norm | norm() | float64 | 262144x1 | 1x1 | 0.3664 ± 0.0091 | 0.1884 ± 0.0090 | 1.4316 ± 0.0351 | 2.7879 ± 0.1301 | 1.95x ± 0.06x | 94.68% ± 6.04% |
| array | vector_normalize | normalize() | float32 | 262144x1 | 262144x1 | 2.1937 ± 0.0534 | 0.8286 ± 0.0203 | 0.3587 ± 0.0086 | 0.9496 ± 0.0231 | 2.65x ± 0.01x | 164.76% ± 0.75% |
| array | vector_normalize | normalize() | float64 | 262144x1 | 262144x1 | 3.2807 ± 0.0731 | 2.7954 ± 0.1001 | 0.2398 ± 0.0053 | 0.2816 ± 0.0098 | 1.17x ± 0.02x | 17.42% ± 1.96% |
| array | vector_segment | segment() | float32 | 262144x1 | 131072x1 | 0.3051 ± 0.0075 | 0.0634 ± 0.0016 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.81x ± 0.04x | 381.18% ± 3.64% |
| array | vector_segment | segment() | float64 | 262144x1 | 131072x1 | 0.3085 ± 0.0087 | 0.1298 ± 0.0076 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.38x ± 0.08x | 138.05% ± 7.98% |
| array | vector_select | mask.select(a, b) | float32 | 262144x1 | 262144x1 | 0.8723 ± 0.0534 | 0.4859 ± 0.0146 | 0.3016 ± 0.0184 | 0.5400 ± 0.0162 | 1.80x ± 0.10x | 79.55% ± 9.87% |
| array | vector_select | mask.select(a, b) | float64 | 262144x1 | 262144x1 | 0.8716 ± 0.0160 | 1.1196 ± 0.0231 | 0.3009 ± 0.0056 | 0.2342 ± 0.0048 | 0.78x ± 0.01x | -22.14% ± 1.45% |
| array | vector_sin | sin(a) | float32 | 262144x1 | 262144x1 | 5.6152 ± 0.1374 | 2.1254 ± 0.0533 | 0.0467 ± 0.0011 | 0.1234 ± 0.0030 | 2.64x ± 0.01x | 164.20% ± 0.94% |
| array | vector_sin | sin(a) | float64 | 262144x1 | 262144x1 | 11.1028 ± 0.2664 | 10.9457 ± 0.3047 | 0.0236 ± 0.0006 | 0.0240 ± 0.0007 | 1.01x ± 0.01x | 1.45% ± 0.77% |
| array | vector_sqrt | (a + scalar).sqrt() | float32 | 262144x1 | 262144x1 | 5.3624 ± 0.1308 | 0.6281 ± 0.0189 | 0.0978 ± 0.0024 | 0.8354 ± 0.0247 | 8.54x ± 0.09x | 753.91% ± 8.62% |
| array | vector_sqrt | (a + scalar).sqrt() | float64 | 262144x1 | 262144x1 | 6.4080 ± 0.1798 | 2.3226 ± 0.0505 | 0.0819 ± 0.0023 | 0.2258 ± 0.0049 | 2.76x ± 0.03x | 175.88% ± 2.78% |
| array | vector_sub_scalar | a - scalar | float32 | 262144x1 | 262144x1 | 0.6099 ± 0.0147 | 0.1990 ± 0.0070 | 0.4300 ± 0.0103 | 1.3190 ± 0.0450 | 3.07x ± 0.05x | 206.68% ± 4.71% |
| array | vector_sub_scalar | a - scalar | float64 | 262144x1 | 262144x1 | 0.7140 ± 0.0164 | 0.6069 ± 0.0120 | 0.3673 ± 0.0083 | 0.4321 ± 0.0085 | 1.18x ± 0.02x | 17.66% ± 2.20% |
| array | vector_sub_vector | a - b | float32 | 262144x1 | 262144x1 | 0.7392 ± 0.0189 | 0.2508 ± 0.0181 | 0.3549 ± 0.0091 | 1.0504 ± 0.0765 | 2.96x ± 0.22x | 196.14% ± 22.40% |
| array | vector_sub_vector | a - b | float64 | 262144x1 | 262144x1 | 1.0259 ± 0.0285 | 0.9138 ± 0.0488 | 0.2557 ± 0.0071 | 0.2876 ± 0.0147 | 1.13x ± 0.06x | 12.52% ± 6.01% |
| array | vector_sum | sum() | float32 | 262144x1 | 1x1 | 0.3661 ± 0.0085 | 0.0450 ± 0.0013 | 0.7163 ± 0.0166 | 5.8288 ± 0.1619 | 8.13x ± 0.10x | 713.41% ± 10.38% |
| array | vector_sum | sum() | float64 | 262144x1 | 1x1 | 0.3671 ± 0.0091 | 0.0918 ± 0.0040 | 0.7145 ± 0.0175 | 2.8612 ± 0.1207 | 4.00x ± 0.16x | 300.47% ± 15.59% |
| array | vector_tanh | tanh(a * scalar) | float32 | 262144x1 | 262144x1 | 2.8000 ± 0.0678 | 1.2313 ± 0.0309 | 0.1873 ± 0.0045 | 0.4260 ± 0.0106 | 2.27x ± 0.00x | 127.40% ± 0.48% |
| array | vector_tanh | tanh(a * scalar) | float64 | 262144x1 | 262144x1 | 15.6625 ± 0.4161 | 15.4361 ± 0.3628 | 0.0335 ± 0.0009 | 0.0340 ± 0.0008 | 1.01x ± 0.00x | 1.46% ± 0.48% |
| geometry | quaternion_inverse | Quaternion::inverse() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1083 ± 0.0078 | 0.0989 ± 0.0024 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_inverse | Quaternion::inverse() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0972 ± 0.0060 | 0.0699 ± 0.0053 | 0.85x ± 0.24x | -15.00% ± 24.15% |
| geometry | quaternion_normalize | Quaternion::normalize() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1261 ± 0.0047 | 0.1134 ± 0.0023 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1074 ± 0.0040 | 0.0821 ± 0.0027 | 0.90x ± 0.21x | -10.00% ± 21.08% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float32 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3592 ± 0.0117 | 0.2732 ± 0.0086 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float64 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3604 ± 0.0119 | 0.2669 ± 0.0238 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1288 ± 0.0043 | 0.1125 ± 0.0029 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1290 ± 0.0053 | 0.1104 ± 0.0047 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_add | A + B | float32 | 512x512 | 512x512 | 0.7408 ± 0.0198 | 0.2449 ± 0.0092 | 0.3541 ± 0.0093 | 1.0717 ± 0.0393 | 3.03x ± 0.13x | 202.83% ± 13.27% |
| matrix | matrix_add | A + B | float64 | 512x512 | 512x512 | 1.0272 ± 0.0284 | 0.9091 ± 0.0211 | 0.2554 ± 0.0070 | 0.2885 ± 0.0066 | 1.13x ± 0.05x | 13.07% ± 5.01% |
| matrix | matrix_block | block() | float32 | 512x512 | 256x256 | 0.1435 ± 0.0035 | 0.0338 ± 0.0009 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.24x ± 0.03x | 324.39% ± 2.75% |
| matrix | matrix_block | block() | float64 | 512x512 | 256x256 | 0.1593 ± 0.0039 | 0.0640 ± 0.0013 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.49x ± 0.05x | 149.02% ± 4.70% |
| matrix | matrix_colwise_sum | colwise().sum() | float32 | 512x512 | 1x512 | 0.3701 ± 0.0092 | 0.0473 ± 0.0014 | 0.7074 ± 0.0174 | 5.5389 ± 0.1637 | 7.83x ± 0.09x | 683.04% ± 9.44% |
| matrix | matrix_colwise_sum | colwise().sum() | float64 | 512x512 | 1x512 | 0.3733 ± 0.0092 | 0.0945 ± 0.0048 | 0.7012 ± 0.0172 | 2.7750 ± 0.1313 | 3.96x ± 0.18x | 295.81% ± 18.29% |
| matrix | matrix_cwise_product | cwiseProduct | float32 | 512x512 | 512x512 | 0.6404 ± 0.0145 | 0.2580 ± 0.0107 | 0.4095 ± 0.0092 | 1.0177 ± 0.0413 | 2.49x ± 0.10x | 148.58% ± 10.46% |
| matrix | matrix_cwise_product | cwiseProduct | float64 | 512x512 | 512x512 | 1.0405 ± 0.0209 | 0.9080 ± 0.0274 | 0.2520 ± 0.0051 | 0.2889 ± 0.0085 | 1.15x ± 0.04x | 14.68% ± 4.11% |
| matrix | matrix_determinant | determinant() | float32 | 512x512 | 1x1 | 42.2178 ± 0.9951 | 14.7710 ± 0.4316 | 2.1205 ± 0.0496 | 6.0623 ± 0.1745 | 2.86x ± 0.02x | 185.86% ± 2.47% |
| matrix | matrix_determinant | determinant() | float64 | 512x512 | 1x1 | 53.0025 ± 1.5707 | 25.6416 ± 0.6506 | 1.6895 ± 0.0501 | 3.4916 ± 0.0877 | 2.07x ± 0.04x | 106.72% ± 4.05% |
| matrix | matrix_gemv | A * x | float32 | 512x512 | 512x1 | 0.1724 ± 0.0041 | 0.0818 ± 0.0017 | 3.0390 ± 0.0709 | 6.4019 ± 0.1328 | 2.11x ± 0.03x | 110.71% ± 2.56% |
| matrix | matrix_gemv | A * x | float64 | 512x512 | 512x1 | 0.3434 ± 0.0233 | 0.1834 ± 0.0070 | 1.5312 ± 0.0975 | 2.8592 ± 0.1058 | 1.87x ± 0.12x | 87.32% ± 12.38% |
| matrix | matrix_identity | Identity() | float32 | 1x1 | 512x512 | 0.9450 ± 0.0187 | 0.3809 ± 0.0093 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.48x ± 0.05x | 148.18% ± 5.28% |
| matrix | matrix_identity | Identity() | float64 | 1x1 | 512x512 | 0.6247 ± 0.0140 | 0.4294 ± 0.0115 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.46x ± 0.03x | 45.52% ± 3.29% |
| matrix | matrix_inverse | inverse() | float32 | 512x512 | 512x512 | 217.4607 ± 5.4640 | 58.4411 ± 1.3855 | 1.2351 ± 0.0307 | 4.5956 ± 0.1079 | 3.72x ± 0.01x | 272.09% ± 1.43% |
| matrix | matrix_inverse | inverse() | float64 | 512x512 | 512x512 | 224.3264 ± 6.5301 | 100.5545 ± 2.4741 | 1.1976 ± 0.0351 | 2.6710 ± 0.0651 | 2.23x ± 0.05x | 123.11% ± 5.04% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float32 | 512x512 | 512x1 | 0.2000 ± 0.0083 | 0.1439 ± 0.0033 | 2.6252 ± 0.1054 | 3.6446 ± 0.0837 | 1.39x ± 0.04x | 38.95% ± 3.52% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float64 | 512x512 | 512x1 | 0.3129 ± 0.0116 | 0.2903 ± 0.0069 | 1.6778 ± 0.0605 | 1.8069 ± 0.0424 | 1.08x ± 0.03x | 7.77% ± 2.86% |
| matrix | matrix_llt_solve | LLT::solve(x) | float32 | 512x512 | 512x1 | 0.2019 ± 0.0070 | 0.1494 ± 0.0036 | 2.5991 ± 0.0870 | 3.5117 ± 0.0847 | 1.35x ± 0.03x | 35.18% ± 2.66% |
| matrix | matrix_llt_solve | LLT::solve(x) | float64 | 512x512 | 512x1 | 0.3126 ± 0.0078 | 0.2897 ± 0.0061 | 1.6782 ± 0.0421 | 1.8108 ± 0.0379 | 1.08x ± 0.02x | 7.93% ± 1.98% |
| matrix | matrix_matmul | A * B | float32 | 512x512 | 512x512 | 71.7630 ± 1.8402 | 22.4028 ± 0.5166 | 3.7391 ± 0.0949 | 11.9762 ± 0.2737 | 3.20x ± 0.01x | 220.31% ± 1.10% |
| matrix | matrix_matmul | A * B | float64 | 512x512 | 512x512 | 93.7697 ± 2.3706 | 46.0085 ± 1.0569 | 2.8616 ± 0.0723 | 5.8315 ± 0.1328 | 2.04x ± 0.03x | 103.82% ± 2.80% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float32 | 512x512 | 512x1 | 1.8259 ± 0.0486 | 0.2395 ± 0.0056 | 0.1434 ± 0.0038 | 1.0928 ± 0.0254 | 7.62x ± 0.14x | 662.34% ± 13.72% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float64 | 512x512 | 512x1 | 2.5977 ± 0.0687 | 0.6699 ± 0.0711 | 0.1008 ± 0.0027 | 0.3939 ± 0.0351 | 3.91x ± 0.35x | 291.00% ± 35.02% |
| matrix | matrix_sub | A - B | float32 | 512x512 | 512x512 | 0.6398 ± 0.0157 | 0.2459 ± 0.0093 | 0.4100 ± 0.0100 | 1.0674 ± 0.0389 | 2.60x ± 0.10x | 160.45% ± 10.38% |
| matrix | matrix_sub | A - B | float64 | 512x512 | 512x512 | 1.0246 ± 0.0291 | 0.9139 ± 0.0376 | 0.2560 ± 0.0071 | 0.2873 ± 0.0114 | 1.12x ± 0.06x | 12.31% ± 6.26% |
| matrix | matrix_trace | trace() | float32 | 512x512 | 1x1 | 0.0008 ± 0.0001 | 0.0009 ± 0.0001 | 0.6096 ± 0.0363 | 0.5975 ± 0.0523 | 0.97x ± 0.08x | -2.93% ± 8.27% |
| matrix | matrix_trace | trace() | float64 | 512x512 | 1x1 | 0.0011 ± 0.0000 | 0.0011 ± 0.0000 | 0.4747 ± 0.0121 | 0.4709 ± 0.0135 | 0.96x ± 0.05x | -3.56% ± 4.60% |
| matrix | matrix_transpose | transpose() | float32 | 512x512 | 512x512 | 2.2251 ± 0.0531 | 1.8858 ± 0.0435 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.18x ± 0.01x | 17.99% ± 0.73% |
| matrix | matrix_transpose | transpose() | float64 | 512x512 | 512x512 | 3.4085 ± 0.1070 | 3.5317 ± 0.1711 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.97x ± 0.04x | -3.34% ± 4.33% |
| matrix | matrix_zero | Zero() | float32 | 1x1 | 512x512 | 0.4170 ± 0.0109 | 0.0926 ± 0.0020 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.50x ± 0.04x | 350.19% ± 3.56% |
| matrix | matrix_zero | Zero() | float64 | 1x1 | 512x512 | 0.4684 ± 0.0105 | 0.1874 ± 0.0065 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.50x ± 0.08x | 150.17% ± 8.28% |
四核对比
taskset -c 0-3
threads:4
| module | function | api | dtype | input_size | output_size | libeigen3-dev avg_ms mean±sd | eigen-spacemit avg_ms mean±sd | libeigen3-dev avg_gflops mean±sd | eigen-spacemit avg_gflops mean±sd | speedup mean±sd | improvement mean±sd |
|---|---|---|---|---|---|---|---|---|---|---|---|
| array | vector_abs | abs(a - scalar) | float32 | 262144x1 | 262144x1 | 0.6274 ± 0.0143 | 0.2503 ± 0.0061 | 0.4180 ± 0.0096 | 1.0479 ± 0.0264 | 2.51x ± 0.06x | 150.71% ± 5.71% |
| array | vector_abs | abs(a - scalar) | float64 | 262144x1 | 262144x1 | 0.8665 ± 0.0251 | 0.6945 ± 0.0091 | 0.3028 ± 0.0089 | 0.3775 ± 0.0049 | 1.25x ± 0.04x | 24.79% ± 4.23% |
| array | vector_add_scalar | a + scalar | float32 | 262144x1 | 262144x1 | 0.6428 ± 0.0214 | 0.2105 ± 0.0101 | 0.4082 ± 0.0140 | 1.2479 ± 0.0613 | 3.06x ± 0.11x | 205.69% ± 10.72% |
| array | vector_add_scalar | a + scalar | float64 | 262144x1 | 262144x1 | 0.7743 ± 0.0215 | 0.6206 ± 0.0153 | 0.3388 ± 0.0096 | 0.4226 ± 0.0104 | 1.25x ± 0.04x | 24.82% ± 4.01% |
| array | vector_add_vector | a + b | float32 | 262144x1 | 262144x1 | 0.7733 ± 0.0248 | 0.2626 ± 0.0146 | 0.3393 ± 0.0111 | 1.0011 ± 0.0571 | 2.95x ± 0.11x | 194.91% ± 10.77% |
| array | vector_add_vector | a + b | float64 | 262144x1 | 262144x1 | 1.0735 ± 0.0306 | 0.8903 ± 0.0272 | 0.2444 ± 0.0071 | 0.2947 ± 0.0085 | 1.21x ± 0.04x | 20.64% ± 4.12% |
| array | vector_clamp | cwiseMax + cwiseMin | float32 | 262144x1 | 262144x1 | 0.7595 ± 0.0188 | 0.4512 ± 0.0095 | 0.6907 ± 0.0170 | 1.1626 ± 0.0251 | 1.68x ± 0.04x | 68.37% ± 4.04% |
| array | vector_clamp | cwiseMax + cwiseMin | float64 | 262144x1 | 262144x1 | 0.9385 ± 0.0169 | 1.0677 ± 0.0210 | 0.5588 ± 0.0100 | 0.4913 ± 0.0097 | 0.88x ± 0.02x | -12.08% ± 1.81% |
| array | vector_cos | cos(a) | float32 | 262144x1 | 262144x1 | 5.8698 ± 0.1365 | 2.1296 ± 0.0422 | 0.0447 ± 0.0010 | 0.1231 ± 0.0025 | 2.76x ± 0.05x | 175.65% ± 5.05% |
| array | vector_cos | cos(a) | float64 | 262144x1 | 262144x1 | 11.2248 ± 0.1838 | 11.1351 ± 0.2361 | 0.0234 ± 0.0004 | 0.0235 ± 0.0005 | 1.01x ± 0.01x | 0.82% ± 1.18% |
| array | vector_div_scalar | a / scalar | float32 | 262144x1 | 262144x1 | 1.6620 ± 0.0552 | 0.6891 ± 0.0273 | 0.1579 ± 0.0053 | 0.3810 ± 0.0154 | 2.41x ± 0.07x | 141.31% ± 6.84% |
| array | vector_div_scalar | a / scalar | float64 | 262144x1 | 262144x1 | 2.7798 ± 0.0835 | 2.4699 ± 0.0762 | 0.0944 ± 0.0029 | 0.1062 ± 0.0033 | 1.13x ± 0.03x | 12.58% ± 3.03% |
| array | vector_div_vector | a / (b + scalar) | float32 | 262144x1 | 262144x1 | 1.6439 ± 0.0429 | 0.7931 ± 0.0330 | 0.3191 ± 0.0083 | 0.6621 ± 0.0278 | 2.07x ± 0.06x | 107.47% ± 6.28% |
| array | vector_div_vector | a / (b + scalar) | float64 | 262144x1 | 262144x1 | 2.7681 ± 0.1037 | 2.6653 ± 0.0562 | 0.1896 ± 0.0071 | 0.1968 ± 0.0041 | 1.04x ± 0.04x | 3.88% ± 4.09% |
| array | vector_dot | dot() | float32 | 262144x1 | 1x1 | 0.3929 ± 0.0334 | 0.1007 ± 0.0122 | 1.3422 ± 0.1031 | 5.2688 ± 0.5900 | 3.96x ± 0.65x | 296.11% ± 65.05% |
| array | vector_dot | dot() | float64 | 262144x1 | 1x1 | 0.5018 ± 0.0491 | 0.4140 ± 0.0218 | 1.0526 ± 0.0875 | 1.2696 ± 0.0666 | 1.22x ± 0.15x | 21.61% ± 15.03% |
| array | vector_exp | exp(a * scalar) | float32 | 262144x1 | 262144x1 | 6.9051 ± 0.1454 | 2.2167 ± 0.0852 | 0.0760 ± 0.0016 | 0.2368 ± 0.0093 | 3.12x ± 0.11x | 211.81% ± 10.69% |
| array | vector_exp | exp(a * scalar) | float64 | 262144x1 | 262144x1 | 7.2381 ± 0.0942 | 7.0569 ± 0.1752 | 0.0725 ± 0.0010 | 0.0743 ± 0.0019 | 1.03x ± 0.02x | 2.61% ± 1.94% |
| array | vector_fma | a * b + c | float32 | 262144x1 | 262144x1 | 1.2551 ± 0.0285 | 0.4861 ± 0.0110 | 0.4179 ± 0.0093 | 1.0791 ± 0.0245 | 2.58x ± 0.07x | 158.32% ± 7.42% |
| array | vector_fma | a * b + c | float64 | 262144x1 | 262144x1 | 1.4918 ± 0.0234 | 1.2963 ± 0.0273 | 0.3515 ± 0.0055 | 0.4046 ± 0.0084 | 1.15x ± 0.03x | 15.14% ± 3.41% |
| array | vector_log | log(a + scalar) | float32 | 262144x1 | 262144x1 | 6.6297 ± 0.1274 | 2.1498 ± 0.0804 | 0.0791 ± 0.0015 | 0.2442 ± 0.0093 | 3.09x ± 0.11x | 208.72% ± 11.28% |
| array | vector_log | log(a + scalar) | float64 | 262144x1 | 262144x1 | 7.5689 ± 0.1399 | 6.3410 ± 0.1317 | 0.0693 ± 0.0013 | 0.0827 ± 0.0017 | 1.19x ± 0.02x | 19.38% ± 1.84% |
| array | vector_max | max(a, b) | float32 | 262144x1 | 262144x1 | 0.7821 ± 0.0690 | 0.3281 ± 0.0172 | 0.3372 ± 0.0262 | 0.8011 ± 0.0422 | 2.39x ± 0.24x | 138.94% ± 24.04% |
| array | vector_max | max(a, b) | float64 | 262144x1 | 262144x1 | 1.0944 ± 0.0531 | 0.9409 ± 0.0279 | 0.2400 ± 0.0111 | 0.2788 ± 0.0084 | 1.16x ± 0.07x | 16.44% ± 7.38% |
| array | vector_min | min(a, b) | float32 | 262144x1 | 262144x1 | 0.8819 ± 0.0216 | 0.3255 ± 0.0157 | 0.2974 ± 0.0073 | 0.8069 ± 0.0378 | 2.71x ± 0.11x | 171.33% ± 11.42% |
| array | vector_min | min(a, b) | float64 | 262144x1 | 262144x1 | 1.0774 ± 0.0491 | 0.9156 ± 0.0224 | 0.2438 ± 0.0108 | 0.2864 ± 0.0070 | 1.18x ± 0.07x | 17.75% ± 6.54% |
| array | vector_mul_scalar | a * scalar | float32 | 262144x1 | 262144x1 | 0.7686 ± 0.0273 | 0.2254 ± 0.0107 | 0.3415 ± 0.0123 | 1.1652 ± 0.0570 | 3.41x ± 0.12x | 241.25% ± 12.24% |
| array | vector_mul_scalar | a * scalar | float64 | 262144x1 | 262144x1 | 0.7651 ± 0.0184 | 0.6495 ± 0.0214 | 0.3428 ± 0.0084 | 0.4040 ± 0.0130 | 1.18x ± 0.04x | 17.89% ± 4.20% |
| array | vector_mul_vector | a * b | float32 | 262144x1 | 262144x1 | 0.7690 ± 0.0255 | 0.2754 ± 0.0139 | 0.3412 ± 0.0113 | 0.9540 ± 0.0499 | 2.80x ± 0.14x | 179.67% ± 13.87% |
| array | vector_mul_vector | a * b | float64 | 262144x1 | 262144x1 | 1.0740 ± 0.0396 | 0.8982 ± 0.0283 | 0.2444 ± 0.0090 | 0.2921 ± 0.0089 | 1.20x ± 0.07x | 19.72% ± 6.77% |
| array | vector_norm | norm() | float32 | 262144x1 | 1x1 | 0.3798 ± 0.0118 | 0.0855 ± 0.0017 | 1.3816 ± 0.0428 | 6.1338 ± 0.1220 | 4.44x ± 0.12x | 344.27% ± 11.66% |
| array | vector_norm | norm() | float64 | 262144x1 | 1x1 | 0.3772 ± 0.0092 | 0.1904 ± 0.0055 | 1.3907 ± 0.0336 | 2.7558 ± 0.0801 | 1.98x ± 0.05x | 98.19% ± 5.16% |
| array | vector_normalize | normalize() | float32 | 262144x1 | 262144x1 | 2.2772 ± 0.0695 | 0.8451 ± 0.0177 | 0.3456 ± 0.0106 | 0.9309 ± 0.0200 | 2.69x ± 0.07x | 169.48% ± 6.68% |
| array | vector_normalize | normalize() | float64 | 262144x1 | 262144x1 | 3.3798 ± 0.0886 | 2.8385 ± 0.0706 | 0.2328 ± 0.0061 | 0.2772 ± 0.0069 | 1.19x ± 0.03x | 19.09% ± 2.70% |
| array | vector_segment | segment() | float32 | 262144x1 | 131072x1 | 0.3164 ± 0.0098 | 0.0646 ± 0.0011 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.90x ± 0.11x | 389.82% ± 11.47% |
| array | vector_segment | segment() | float64 | 262144x1 | 131072x1 | 0.3174 ± 0.0101 | 0.1354 ± 0.0055 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.35x ± 0.09x | 134.71% ± 8.73% |
| array | vector_select | mask.select(a, b) | float32 | 262144x1 | 262144x1 | 0.9031 ± 0.0361 | 0.4990 ± 0.0163 | 0.2907 ± 0.0119 | 0.5258 ± 0.0173 | 1.81x ± 0.09x | 81.12% ± 8.87% |
| array | vector_select | mask.select(a, b) | float64 | 262144x1 | 262144x1 | 0.9579 ± 0.0377 | 1.1470 ± 0.0242 | 0.2741 ± 0.0107 | 0.2286 ± 0.0048 | 0.84x ± 0.03x | -16.46% ± 3.46% |
| array | vector_sin | sin(a) | float32 | 262144x1 | 262144x1 | 5.7507 ± 0.0914 | 2.1754 ± 0.0579 | 0.0456 ± 0.0007 | 0.1206 ± 0.0032 | 2.64x ± 0.05x | 164.45% ± 5.10% |
| array | vector_sin | sin(a) | float64 | 262144x1 | 262144x1 | 11.3619 ± 0.1629 | 11.3429 ± 0.2903 | 0.0231 ± 0.0003 | 0.0231 ± 0.0006 | 1.00x ± 0.02x | 0.20% ± 1.75% |
| array | vector_sqrt | (a + scalar).sqrt() | float32 | 262144x1 | 262144x1 | 5.4976 ± 0.0881 | 0.6506 ± 0.0249 | 0.0954 ± 0.0016 | 0.8069 ± 0.0313 | 8.46x ± 0.27x | 745.83% ± 27.12% |
| array | vector_sqrt | (a + scalar).sqrt() | float64 | 262144x1 | 262144x1 | 6.6503 ± 0.1665 | 2.4066 ± 0.0649 | 0.0789 ± 0.0020 | 0.2180 ± 0.0059 | 2.76x ± 0.09x | 176.46% ± 8.55% |
| array | vector_sub_scalar | a - scalar | float32 | 262144x1 | 262144x1 | 0.6421 ± 0.0208 | 0.2097 ± 0.0100 | 0.4087 ± 0.0136 | 1.2528 ± 0.0616 | 3.07x ± 0.11x | 206.55% ± 10.72% |
| array | vector_sub_scalar | a - scalar | float64 | 262144x1 | 262144x1 | 0.7746 ± 0.0235 | 0.6244 ± 0.0198 | 0.3387 ± 0.0104 | 0.4202 ± 0.0133 | 1.24x ± 0.05x | 24.14% ± 4.85% |
| array | vector_sub_vector | a - b | float32 | 262144x1 | 262144x1 | 0.7705 ± 0.0244 | 0.2614 ± 0.0130 | 0.3406 ± 0.0108 | 1.0054 ± 0.0512 | 2.95x ± 0.13x | 195.25% ± 12.72% |
| array | vector_sub_vector | a - b | float64 | 262144x1 | 262144x1 | 1.0788 ± 0.0456 | 0.8893 ± 0.0266 | 0.2434 ± 0.0102 | 0.2950 ± 0.0084 | 1.21x ± 0.07x | 21.42% ± 6.67% |
| array | vector_sum | sum() | float32 | 262144x1 | 1x1 | 0.3786 ± 0.0105 | 0.0458 ± 0.0010 | 0.6929 ± 0.0193 | 5.7290 ± 0.1326 | 8.27x ± 0.22x | 726.95% ± 22.18% |
| array | vector_sum | sum() | float64 | 262144x1 | 1x1 | 0.3775 ± 0.0091 | 0.0937 ± 0.0041 | 0.6947 ± 0.0167 | 2.8015 ± 0.1179 | 4.03x ± 0.17x | 303.33% ± 17.47% |
| array | vector_tanh | tanh(a * scalar) | float32 | 262144x1 | 262144x1 | 2.9032 ± 0.0848 | 1.2529 ± 0.0247 | 0.1807 ± 0.0053 | 0.4186 ± 0.0085 | 2.32x ± 0.06x | 131.73% ± 5.53% |
| array | vector_tanh | tanh(a * scalar) | float64 | 262144x1 | 262144x1 | 16.0917 ± 0.2985 | 15.9251 ± 0.3440 | 0.0326 ± 0.0006 | 0.0329 ± 0.0007 | 1.01x ± 0.01x | 1.06% ± 1.09% |
| geometry | quaternion_inverse | Quaternion::inverse() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1071 ± 0.0036 | 0.0947 ± 0.0057 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_inverse | Quaternion::inverse() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0001 | 0.0001 ± 0.0000 | 0.0864 ± 0.0193 | 0.0685 ± 0.0020 | 1.10x ± 0.70x | 10.00% ± 69.92% |
| geometry | quaternion_normalize | Quaternion::normalize() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1231 ± 0.0097 | 0.1115 ± 0.0045 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1029 ± 0.0037 | 0.0815 ± 0.0054 | 0.85x ± 0.24x | -15.00% ± 24.15% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float32 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3439 ± 0.0103 | 0.2628 ± 0.0115 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float64 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3574 ± 0.0300 | 0.2560 ± 0.0085 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1241 ± 0.0037 | 0.1094 ± 0.0030 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1224 ± 0.0051 | 0.1076 ± 0.0031 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_add | A + B | float32 | 512x512 | 512x512 | 0.7672 ± 0.0245 | 0.2550 ± 0.0146 | 0.3420 ± 0.0108 | 1.0312 ± 0.0587 | 3.02x ± 0.23x | 201.97% ± 22.84% |
| matrix | matrix_add | A + B | float64 | 512x512 | 512x512 | 1.0685 ± 0.0329 | 0.8896 ± 0.0194 | 0.2455 ± 0.0073 | 0.2948 ± 0.0062 | 1.20x ± 0.05x | 20.17% ± 4.96% |
| matrix | matrix_block | block() | float32 | 512x512 | 256x256 | 0.1484 ± 0.0040 | 0.0352 ± 0.0011 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.22x ± 0.06x | 321.95% ± 6.38% |
| matrix | matrix_block | block() | float64 | 512x512 | 256x256 | 0.1623 ± 0.0037 | 0.0664 ± 0.0019 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.45x ± 0.04x | 144.58% ± 4.16% |
| matrix | matrix_colwise_sum | colwise().sum() | float32 | 512x512 | 1x512 | 0.3820 ± 0.0103 | 0.0490 ± 0.0019 | 0.6855 ± 0.0185 | 5.3448 ± 0.2062 | 7.80x ± 0.29x | 679.92% ± 29.15% |
| matrix | matrix_colwise_sum | colwise().sum() | float64 | 512x512 | 1x512 | 0.3858 ± 0.0127 | 0.0969 ± 0.0038 | 0.6788 ± 0.0225 | 2.7027 ± 0.1067 | 3.98x ± 0.19x | 298.46% ± 18.86% |
| matrix | matrix_cwise_product | cwiseProduct | float32 | 512x512 | 512x512 | 0.6632 ± 0.0275 | 0.2684 ± 0.0128 | 0.3959 ± 0.0160 | 0.9784 ± 0.0436 | 2.47x ± 0.14x | 147.45% ± 13.65% |
| matrix | matrix_cwise_product | cwiseProduct | float64 | 512x512 | 512x512 | 1.0739 ± 0.0355 | 0.9244 ± 0.0324 | 0.2444 ± 0.0080 | 0.2839 ± 0.0100 | 1.16x ± 0.06x | 16.32% ± 6.20% |
| matrix | matrix_determinant | determinant() | float32 | 512x512 | 1x1 | 25.0644 ± 0.6742 | 11.0655 ± 0.3305 | 3.5724 ± 0.0997 | 8.0929 ± 0.2473 | 2.27x ± 0.06x | 126.60% ± 6.36% |
| matrix | matrix_determinant | determinant() | float64 | 512x512 | 1x1 | 30.3570 ± 0.7799 | 17.9423 ± 0.4328 | 2.9494 ± 0.0787 | 4.9897 ± 0.1230 | 1.69x ± 0.03x | 69.21% ± 3.09% |
| matrix | matrix_gemv | A * x | float32 | 512x512 | 512x1 | 0.1794 ± 0.0058 | 0.0856 ± 0.0037 | 2.9220 ± 0.0949 | 6.1306 ± 0.2670 | 2.10x ± 0.08x | 109.90% ± 8.43% |
| matrix | matrix_gemv | A * x | float64 | 512x512 | 512x1 | 0.3457 ± 0.0083 | 0.1925 ± 0.0065 | 1.5160 ± 0.0364 | 2.7236 ± 0.0946 | 1.80x ± 0.06x | 79.70% ± 6.35% |
| matrix | matrix_identity | Identity() | float32 | 1x1 | 512x512 | 0.9681 ± 0.0481 | 0.3927 ± 0.0122 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.46x ± 0.07x | 146.44% ± 7.27% |
| matrix | matrix_identity | Identity() | float64 | 1x1 | 512x512 | 0.6387 ± 0.0150 | 0.4434 ± 0.0126 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.44x ± 0.02x | 44.07% ± 2.35% |
| matrix | matrix_inverse | inverse() | float32 | 512x512 | 512x512 | 205.4377 ± 3.8438 | 53.1489 ± 1.3958 | 1.3071 ± 0.0252 | 5.0538 ± 0.1357 | 3.87x ± 0.07x | 286.64% ± 6.58% |
| matrix | matrix_inverse | inverse() | float64 | 512x512 | 512x512 | 195.1338 ± 4.9092 | 91.9283 ± 2.1262 | 1.3764 ± 0.0348 | 2.9215 ± 0.0682 | 2.12x ± 0.05x | 112.30% ± 4.64% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float32 | 512x512 | 512x1 | 0.2127 ± 0.0114 | 0.1515 ± 0.0057 | 2.4712 ± 0.1338 | 3.4650 ± 0.1339 | 1.40x ± 0.06x | 40.44% ± 6.05% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float64 | 512x512 | 512x1 | 0.3276 ± 0.0107 | 0.3058 ± 0.0103 | 1.6019 ± 0.0553 | 1.7160 ± 0.0600 | 1.07x ± 0.03x | 7.17% ± 3.26% |
| matrix | matrix_llt_solve | LLT::solve(x) | float32 | 512x512 | 512x1 | 0.2124 ± 0.0080 | 0.1570 ± 0.0053 | 2.4712 ± 0.0964 | 3.3415 ± 0.1162 | 1.35x ± 0.05x | 35.32% ± 4.64% |
| matrix | matrix_llt_solve | LLT::solve(x) | float64 | 512x512 | 512x1 | 0.3287 ± 0.0110 | 0.3079 ± 0.0114 | 1.5969 ± 0.0564 | 1.7051 ± 0.0659 | 1.07x ± 0.04x | 6.82% ± 3.72% |
| matrix | matrix_matmul | A * B | float32 | 512x512 | 512x512 | 21.2244 ± 0.6392 | 6.0132 ± 0.1926 | 12.6459 ± 0.3981 | 44.6392 ± 1.4428 | 3.53x ± 0.08x | 253.07% ± 8.25% |
| matrix | matrix_matmul | A * B | float64 | 512x512 | 512x512 | 35.5351 ± 1.1246 | 12.5752 ± 0.3502 | 7.5539 ± 0.2536 | 21.3411 ± 0.6207 | 2.83x ± 0.05x | 182.58% ± 4.51% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float32 | 512x512 | 512x1 | 1.8989 ± 0.0616 | 0.2482 ± 0.0106 | 0.1379 ± 0.0045 | 1.0559 ± 0.0452 | 7.66x ± 0.33x | 666.04% ± 32.85% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float64 | 512x512 | 512x1 | 2.6737 ± 0.0848 | 0.6785 ± 0.0265 | 0.0979 ± 0.0031 | 0.3862 ± 0.0154 | 3.94x ± 0.17x | 294.49% ± 17.24% |
| matrix | matrix_sub | A - B | float32 | 512x512 | 512x512 | 0.6607 ± 0.0310 | 0.2564 ± 0.0127 | 0.3975 ± 0.0176 | 1.0244 ± 0.0482 | 2.58x ± 0.21x | 158.42% ± 20.88% |
| matrix | matrix_sub | A - B | float64 | 512x512 | 512x512 | 1.0674 ± 0.0574 | 0.9165 ± 0.0418 | 0.2462 ± 0.0128 | 0.2866 ± 0.0129 | 1.17x ± 0.09x | 16.74% ± 9.15% |
| matrix | matrix_trace | trace() | float32 | 512x512 | 1x1 | 0.0008 ± 0.0000 | 0.0009 ± 0.0002 | 0.6024 ± 0.0180 | 0.5690 ± 0.0877 | 0.93x ± 0.17x | -7.08% ± 16.75% |
| matrix | matrix_trace | trace() | float64 | 512x512 | 1x1 | 0.0011 ± 0.0001 | 0.0011 ± 0.0001 | 0.4578 ± 0.0164 | 0.4521 ± 0.0171 | 0.98x ± 0.07x | -2.42% ± 7.20% |
| matrix | matrix_transpose | transpose() | float32 | 512x512 | 512x512 | 2.2959 ± 0.0572 | 1.9306 ± 0.0522 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.19x ± 0.02x | 18.94% ± 2.22% |
| matrix | matrix_transpose | transpose() | float64 | 512x512 | 512x512 | 3.4579 ± 0.0786 | 3.5339 ± 0.0795 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.98x ± 0.02x | -2.13% ± 2.14% |
| matrix | matrix_zero | Zero() | float32 | 1x1 | 512x512 | 0.4422 ± 0.0122 | 0.0951 ± 0.0030 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.65x ± 0.07x | 364.90% ± 7.12% |
| matrix | matrix_zero | Zero() | float64 | 1x1 | 512x512 | 0.4998 ± 0.0105 | 0.1928 ± 0.0068 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.59x ± 0.07x | 159.39% ± 7.43% |
八核对比
taskset -c 0-7
threads:8
| module | function | api | dtype | input_size | output_size | libeigen3-dev avg_ms mean±sd | eigen-spacemit avg_ms mean±sd | libeigen3-dev avg_gflops mean±sd | eigen-spacemit avg_gflops mean±sd | speedup mean±sd | improvement mean±sd |
|---|---|---|---|---|---|---|---|---|---|---|---|
| array | vector_abs | abs(a - scalar) | float32 | 262144x1 | 262144x1 | 0.6158 ± 0.0202 | 0.2466 ± 0.0046 | 0.4261 ± 0.0135 | 1.0633 ± 0.0200 | 2.50x ± 0.07x | 149.72% ± 6.83% |
| array | vector_abs | abs(a - scalar) | float64 | 262144x1 | 262144x1 | 0.8182 ± 0.0314 | 0.6886 ± 0.0119 | 0.3208 ± 0.0118 | 0.3808 ± 0.0066 | 1.19x ± 0.04x | 18.80% ± 3.51% |
| array | vector_add_scalar | a + scalar | float32 | 262144x1 | 262144x1 | 0.6149 ± 0.0160 | 0.2031 ± 0.0050 | 0.4266 ± 0.0110 | 1.2917 ± 0.0317 | 3.03x ± 0.08x | 202.85% ± 7.68% |
| array | vector_add_scalar | a + scalar | float64 | 262144x1 | 262144x1 | 0.7339 ± 0.0323 | 0.6193 ± 0.0195 | 0.3578 ± 0.0150 | 0.4237 ± 0.0133 | 1.19x ± 0.05x | 18.55% ± 5.13% |
| array | vector_add_vector | a + b | float32 | 262144x1 | 262144x1 | 0.7493 ± 0.0242 | 0.2465 ± 0.0151 | 0.3502 ± 0.0112 | 1.0671 ± 0.0696 | 3.05x ± 0.26x | 205.27% ± 26.00% |
| array | vector_add_vector | a + b | float64 | 262144x1 | 262144x1 | 1.0344 ± 0.0228 | 0.8399 ± 0.0970 | 0.2535 ± 0.0055 | 0.3163 ± 0.0404 | 1.25x ± 0.17x | 24.93% ± 17.30% |
| array | vector_clamp | cwiseMax + cwiseMin | float32 | 262144x1 | 262144x1 | 0.7434 ± 0.0248 | 0.4459 ± 0.0092 | 0.7060 ± 0.0229 | 1.1763 ± 0.0245 | 1.67x ± 0.04x | 66.71% ± 3.76% |
| array | vector_clamp | cwiseMax + cwiseMin | float64 | 262144x1 | 262144x1 | 0.8968 ± 0.0320 | 1.0468 ± 0.0310 | 0.5853 ± 0.0202 | 0.5012 ± 0.0147 | 0.86x ± 0.02x | -14.32% ± 2.06% |
| array | vector_cos | cos(a) | float32 | 262144x1 | 262144x1 | 5.7194 ± 0.1173 | 2.1087 ± 0.0474 | 0.0458 ± 0.0009 | 0.1244 ± 0.0028 | 2.71x ± 0.03x | 171.26% ± 3.44% |
| array | vector_cos | cos(a) | float64 | 262144x1 | 262144x1 | 11.0917 ± 0.3198 | 10.8393 ± 0.3460 | 0.0237 ± 0.0007 | 0.0242 ± 0.0007 | 1.02x ± 0.02x | 2.36% ± 2.10% |
| array | vector_div_scalar | a / scalar | float32 | 262144x1 | 262144x1 | 1.6055 ± 0.0489 | 0.6647 ± 0.0141 | 0.1634 ± 0.0049 | 0.3945 ± 0.0084 | 2.42x ± 0.06x | 141.54% ± 6.24% |
| array | vector_div_scalar | a / scalar | float64 | 262144x1 | 262144x1 | 2.6389 ± 0.0598 | 2.4164 ± 0.0988 | 0.0994 ± 0.0023 | 0.1086 ± 0.0044 | 1.09x ± 0.04x | 9.31% ± 3.52% |
| array | vector_div_vector | a / (b + scalar) | float32 | 262144x1 | 262144x1 | 1.5999 ± 0.0351 | 0.7725 ± 0.0135 | 0.3278 ± 0.0072 | 0.6789 ± 0.0120 | 2.07x ± 0.03x | 107.11% ± 3.21% |
| array | vector_div_vector | a / (b + scalar) | float64 | 262144x1 | 262144x1 | 2.6680 ± 0.0827 | 2.6169 ± 0.0749 | 0.1967 ± 0.0063 | 0.2005 ± 0.0057 | 1.02x ± 0.04x | 2.02% ± 3.99% |
| array | vector_dot | dot() | float32 | 262144x1 | 1x1 | 0.3711 ± 0.0122 | 0.1016 ± 0.0096 | 1.4142 ± 0.0453 | 5.2031 ± 0.4840 | 3.68x ± 0.35x | 268.14% ± 34.66% |
| array | vector_dot | dot() | float64 | 262144x1 | 1x1 | 0.4870 ± 0.0246 | 0.3998 ± 0.0169 | 1.0788 ± 0.0512 | 1.3134 ± 0.0532 | 1.22x ± 0.08x | 22.04% ± 8.39% |
| array | vector_exp | exp(a * scalar) | float32 | 262144x1 | 262144x1 | 6.7447 ± 0.1368 | 2.1485 ± 0.0460 | 0.0778 ± 0.0016 | 0.2441 ± 0.0053 | 3.14x ± 0.06x | 213.98% ± 5.78% |
| array | vector_exp | exp(a * scalar) | float64 | 262144x1 | 262144x1 | 7.1180 ± 0.1497 | 6.8649 ± 0.1892 | 0.0737 ± 0.0016 | 0.0764 ± 0.0021 | 1.04x ± 0.02x | 3.72% ± 1.87% |
| array | vector_fma | a * b + c | float32 | 262144x1 | 262144x1 | 1.2301 ± 0.0239 | 0.4826 ± 0.0121 | 0.4264 ± 0.0083 | 1.0871 ± 0.0281 | 2.55x ± 0.06x | 155.00% ± 6.02% |
| array | vector_fma | a * b + c | float64 | 262144x1 | 262144x1 | 1.5160 ± 0.0387 | 1.2732 ± 0.0245 | 0.3460 ± 0.0089 | 0.4119 ± 0.0079 | 1.19x ± 0.04x | 19.11% ± 3.82% |
| array | vector_log | log(a + scalar) | float32 | 262144x1 | 262144x1 | 6.4831 ± 0.1375 | 2.0885 ± 0.0423 | 0.0809 ± 0.0017 | 0.2511 ± 0.0051 | 3.10x ± 0.05x | 210.45% ± 4.70% |
| array | vector_log | log(a + scalar) | float64 | 262144x1 | 262144x1 | 7.4521 ± 0.2067 | 6.2224 ± 0.2027 | 0.0704 ± 0.0020 | 0.0843 ± 0.0027 | 1.20x ± 0.04x | 19.82% ± 3.55% |
| array | vector_max | max(a, b) | float32 | 262144x1 | 262144x1 | 0.7674 ± 0.0624 | 0.3113 ± 0.0095 | 0.3434 ± 0.0248 | 0.8428 ± 0.0262 | 2.47x ± 0.20x | 146.62% ± 20.31% |
| array | vector_max | max(a, b) | float64 | 262144x1 | 262144x1 | 1.0518 ± 0.0681 | 0.9136 ± 0.0286 | 0.2503 ± 0.0176 | 0.2872 ± 0.0088 | 1.15x ± 0.08x | 15.19% ± 7.85% |
| array | vector_min | min(a, b) | float32 | 262144x1 | 262144x1 | 0.8658 ± 0.0262 | 0.3097 ± 0.0129 | 0.3030 ± 0.0089 | 0.8477 ± 0.0370 | 2.80x ± 0.10x | 179.79% ± 9.59% |
| array | vector_min | min(a, b) | float64 | 262144x1 | 262144x1 | 1.0125 ± 0.0643 | 0.9064 ± 0.0185 | 0.2599 ± 0.0175 | 0.2893 ± 0.0058 | 1.12x ± 0.06x | 11.68% ± 6.48% |
| array | vector_mul_scalar | a * scalar | float32 | 262144x1 | 262144x1 | 0.7404 ± 0.0242 | 0.2193 ± 0.0042 | 0.3544 ± 0.0114 | 1.1957 ± 0.0221 | 3.38x ± 0.11x | 237.68% ± 11.15% |
| array | vector_mul_scalar | a * scalar | float64 | 262144x1 | 262144x1 | 0.7241 ± 0.0168 | 0.6447 ± 0.0230 | 0.3622 ± 0.0084 | 0.4071 ± 0.0142 | 1.12x ± 0.04x | 12.42% ± 3.86% |
| array | vector_mul_vector | a * b | float32 | 262144x1 | 262144x1 | 0.7539 ± 0.0156 | 0.2589 ± 0.0156 | 0.3479 ± 0.0073 | 1.0159 ± 0.0656 | 2.92x ± 0.23x | 192.35% ± 22.93% |
| array | vector_mul_vector | a * b | float64 | 262144x1 | 262144x1 | 1.0405 ± 0.0291 | 0.8708 ± 0.1008 | 0.2521 ± 0.0071 | 0.3055 ± 0.0435 | 1.21x ± 0.19x | 21.42% ± 18.95% |
| array | vector_norm | norm() | float32 | 262144x1 | 1x1 | 0.3704 ± 0.0110 | 0.0847 ± 0.0019 | 1.4167 ± 0.0412 | 6.1915 ± 0.1378 | 4.37x ± 0.11x | 337.10% ± 10.94% |
| array | vector_norm | norm() | float64 | 262144x1 | 1x1 | 0.3744 ± 0.0163 | 0.1925 ± 0.0121 | 1.4027 ± 0.0601 | 2.7332 ± 0.1691 | 1.95x ± 0.08x | 94.85% ± 8.40% |
| array | vector_normalize | normalize() | float32 | 262144x1 | 262144x1 | 2.2142 ± 0.0516 | 0.8405 ± 0.0129 | 0.3553 ± 0.0082 | 0.9359 ± 0.0144 | 2.63x ± 0.04x | 163.44% ± 4.08% |
| array | vector_normalize | normalize() | float64 | 262144x1 | 262144x1 | 3.3215 ± 0.1106 | 2.7936 ± 0.0623 | 0.2370 ± 0.0078 | 0.2816 ± 0.0063 | 1.19x ± 0.02x | 18.89% ± 2.44% |
| array | vector_segment | segment() | float32 | 262144x1 | 131072x1 | 0.3072 ± 0.0098 | 0.0636 ± 0.0016 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.83x ± 0.10x | 382.57% ± 10.03% |
| array | vector_segment | segment() | float64 | 262144x1 | 131072x1 | 0.3107 ± 0.0105 | 0.1337 ± 0.0066 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.33x ± 0.09x | 132.68% ± 9.05% |
| array | vector_select | mask.select(a, b) | float32 | 262144x1 | 262144x1 | 0.8753 ± 0.0384 | 0.4883 ± 0.0100 | 0.3001 ± 0.0142 | 0.5371 ± 0.0111 | 1.79x ± 0.08x | 79.29% ± 8.17% |
| array | vector_select | mask.select(a, b) | float64 | 262144x1 | 262144x1 | 0.8822 ± 0.0347 | 1.1391 ± 0.0298 | 0.2975 ± 0.0119 | 0.2303 ± 0.0059 | 0.77x ± 0.03x | -22.54% ± 2.65% |
| array | vector_sin | sin(a) | float32 | 262144x1 | 262144x1 | 5.6462 ± 0.1128 | 2.1422 ± 0.0447 | 0.0464 ± 0.0009 | 0.1224 ± 0.0026 | 2.64x ± 0.03x | 163.59% ± 2.99% |
| array | vector_sin | sin(a) | float64 | 262144x1 | 262144x1 | 11.2308 ± 0.2559 | 10.9707 ± 0.2745 | 0.0233 ± 0.0005 | 0.0239 ± 0.0006 | 1.02x ± 0.02x | 2.39% ± 2.12% |
| array | vector_sqrt | (a + scalar).sqrt() | float32 | 262144x1 | 262144x1 | 5.3944 ± 0.1229 | 0.6349 ± 0.0106 | 0.0973 ± 0.0022 | 0.8260 ± 0.0139 | 8.50x ± 0.16x | 749.68% ± 16.11% |
| array | vector_sqrt | (a + scalar).sqrt() | float64 | 262144x1 | 262144x1 | 6.4811 ± 0.1675 | 2.3448 ± 0.0704 | 0.0809 ± 0.0021 | 0.2238 ± 0.0066 | 2.77x ± 0.07x | 176.50% ± 6.77% |
| array | vector_sub_scalar | a - scalar | float32 | 262144x1 | 262144x1 | 0.6170 ± 0.0197 | 0.2059 ± 0.0032 | 0.4252 ± 0.0133 | 1.2733 ± 0.0196 | 3.00x ± 0.11x | 199.72% ± 11.04% |
| array | vector_sub_scalar | a - scalar | float64 | 262144x1 | 262144x1 | 0.7278 ± 0.0239 | 0.6184 ± 0.0201 | 0.3605 ± 0.0116 | 0.4243 ± 0.0137 | 1.18x ± 0.03x | 17.73% ± 3.23% |
| array | vector_sub_vector | a - b | float32 | 262144x1 | 262144x1 | 0.7498 ± 0.0230 | 0.2463 ± 0.0153 | 0.3499 ± 0.0107 | 1.0683 ± 0.0723 | 3.06x ± 0.25x | 205.68% ± 24.89% |
| array | vector_sub_vector | a - b | float64 | 262144x1 | 262144x1 | 1.0351 ± 0.0236 | 0.8779 ± 0.0879 | 0.2534 ± 0.0058 | 0.3017 ± 0.0344 | 1.19x ± 0.13x | 19.08% ± 13.33% |
| array | vector_sum | sum() | float32 | 262144x1 | 1x1 | 0.3722 ± 0.0147 | 0.0454 ± 0.0012 | 0.7052 ± 0.0270 | 5.7789 ± 0.1521 | 8.20x ± 0.23x | 719.87% ± 22.77% |
| array | vector_sum | sum() | float64 | 262144x1 | 1x1 | 0.3743 ± 0.0162 | 0.0946 ± 0.0074 | 0.7015 ± 0.0299 | 2.7866 ± 0.2052 | 3.97x ± 0.27x | 297.27% ± 26.68% |
| array | vector_tanh | tanh(a * scalar) | float32 | 262144x1 | 262144x1 | 2.8239 ± 0.0774 | 1.2404 ± 0.0258 | 0.1858 ± 0.0050 | 0.4229 ± 0.0088 | 2.28x ± 0.04x | 127.66% ± 4.03% |
| array | vector_tanh | tanh(a * scalar) | float64 | 262144x1 | 262144x1 | 15.8625 ± 0.5494 | 15.4945 ± 0.3613 | 0.0331 ± 0.0011 | 0.0339 ± 0.0008 | 1.02x ± 0.02x | 2.36% ± 1.73% |
| geometry | quaternion_inverse | Quaternion::inverse() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1102 ± 0.0039 | 0.0972 ± 0.0022 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_inverse | Quaternion::inverse() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0943 ± 0.0020 | 0.0729 ± 0.0058 | 0.95x ± 0.16x | -5.00% ± 15.81% |
| geometry | quaternion_normalize | Quaternion::normalize() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1243 ± 0.0117 | 0.1137 ± 0.0030 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1063 ± 0.0029 | 0.0827 ± 0.0030 | 0.95x ± 0.16x | -5.00% ± 15.81% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float32 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3538 ± 0.0140 | 0.2728 ± 0.0183 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float64 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3566 ± 0.0139 | 0.2691 ± 0.0212 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1278 ± 0.0037 | 0.1104 ± 0.0025 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1268 ± 0.0028 | 0.1098 ± 0.0042 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_add | A + B | float32 | 512x512 | 512x512 | 0.7502 ± 0.0202 | 0.2510 ± 0.0129 | 0.3496 ± 0.0093 | 1.0465 ± 0.0501 | 2.99x ± 0.10x | 199.25% ± 10.20% |
| matrix | matrix_add | A + B | float64 | 512x512 | 512x512 | 1.0258 ± 0.0212 | 0.8888 ± 0.0727 | 0.2556 ± 0.0053 | 0.2970 ± 0.0281 | 1.16x ± 0.13x | 16.30% ± 12.53% |
| matrix | matrix_block | block() | float32 | 512x512 | 256x256 | 0.1442 ± 0.0034 | 0.0348 ± 0.0014 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.14x ± 0.10x | 314.48% ± 9.75% |
| matrix | matrix_block | block() | float64 | 512x512 | 256x256 | 0.1601 ± 0.0062 | 0.0645 ± 0.0021 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.48x ± 0.04x | 148.12% ± 4.44% |
| matrix | matrix_colwise_sum | colwise().sum() | float32 | 512x512 | 1x512 | 0.3769 ± 0.0137 | 0.0493 ± 0.0039 | 0.6950 ± 0.0247 | 5.3323 ± 0.3836 | 7.68x ± 0.52x | 667.54% ± 51.54% |
| matrix | matrix_colwise_sum | colwise().sum() | float64 | 512x512 | 1x512 | 0.3780 ± 0.0163 | 0.1002 ± 0.0069 | 0.6933 ± 0.0293 | 2.6234 ± 0.1838 | 3.79x ± 0.32x | 279.00% ± 31.64% |
| matrix | matrix_cwise_product | cwiseProduct | float32 | 512x512 | 512x512 | 0.6582 ± 0.0279 | 0.2629 ± 0.0111 | 0.3990 ± 0.0166 | 0.9989 ± 0.0407 | 2.51x ± 0.16x | 150.84% ± 15.94% |
| matrix | matrix_cwise_product | cwiseProduct | float64 | 512x512 | 512x512 | 1.0043 ± 0.0663 | 0.8983 ± 0.0840 | 0.2622 ± 0.0191 | 0.2945 ± 0.0324 | 1.13x ± 0.14x | 12.75% ± 13.71% |
| matrix | matrix_determinant | determinant() | float32 | 512x512 | 1x1 | 25.0008 ± 1.7309 | 15.2198 ± 0.5286 | 3.5940 ± 0.2402 | 5.8855 ± 0.2042 | 1.64x ± 0.11x | 64.31% ± 10.50% |
| matrix | matrix_determinant | determinant() | float64 | 512x512 | 1x1 | 32.1621 ± 4.2668 | 21.2876 ± 0.6420 | 2.8195 ± 0.3165 | 4.2067 ± 0.1255 | 1.51x ± 0.19x | 51.04% ± 18.80% |
| matrix | matrix_gemv | A * x | float32 | 512x512 | 512x1 | 0.1753 ± 0.0062 | 0.0889 ± 0.0215 | 2.9914 ± 0.1035 | 6.0938 ± 0.9241 | 2.04x ± 0.31x | 103.93% ± 31.24% |
| matrix | matrix_gemv | A * x | float64 | 512x512 | 512x1 | 0.3356 ± 0.0152 | 0.1887 ± 0.0093 | 1.5633 ± 0.0693 | 2.7823 ± 0.1371 | 1.78x ± 0.11x | 78.21% ± 10.87% |
| matrix | matrix_identity | Identity() | float32 | 1x1 | 512x512 | 0.9374 ± 0.0348 | 0.3871 ± 0.0155 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.42x ± 0.07x | 142.31% ± 7.00% |
| matrix | matrix_identity | Identity() | float64 | 1x1 | 512x512 | 0.6304 ± 0.0250 | 0.4298 ± 0.0144 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.47x ± 0.03x | 46.68% ± 3.37% |
| matrix | matrix_inverse | inverse() | float32 | 512x512 | 512x512 | 205.2442 ± 8.2741 | 57.1382 ± 2.0209 | 1.3098 ± 0.0519 | 4.7033 ± 0.1650 | 3.59x ± 0.08x | 259.22% ± 7.83% |
| matrix | matrix_inverse | inverse() | float64 | 512x512 | 512x512 | 198.7883 ± 13.7298 | 93.3451 ± 2.3236 | 1.3559 ± 0.0900 | 2.8773 ± 0.0711 | 2.13x ± 0.13x | 112.90% ± 12.73% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float32 | 512x512 | 512x1 | 0.2052 ± 0.0077 | 0.1477 ± 0.0067 | 2.5588 ± 0.0955 | 3.5560 ± 0.1592 | 1.39x ± 0.06x | 39.04% ± 6.14% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float64 | 512x512 | 512x1 | 0.3569 ± 0.0235 | 0.3023 ± 0.0191 | 1.4748 ± 0.1014 | 1.7408 ± 0.1093 | 1.18x ± 0.09x | 18.38% ± 8.92% |
| matrix | matrix_llt_solve | LLT::solve(x) | float32 | 512x512 | 512x1 | 0.2087 ± 0.0077 | 0.1535 ± 0.0073 | 2.5145 ± 0.0937 | 3.4225 ± 0.1610 | 1.36x ± 0.06x | 36.18% ± 6.38% |
| matrix | matrix_llt_solve | LLT::solve(x) | float64 | 512x512 | 512x1 | 0.3555 ± 0.0237 | 0.3027 ± 0.0185 | 1.4810 ± 0.1024 | 1.7374 ± 0.1033 | 1.18x ± 0.06x | 17.50% ± 5.90% |
| matrix | matrix_matmul | A * B | float32 | 512x512 | 512x512 | 11.9369 ± 0.6003 | 3.6781 ± 0.6593 | 22.5172 ± 1.1346 | 74.5816 ± 10.4920 | 3.32x ± 0.48x | 231.97% ± 47.54% |
| matrix | matrix_matmul | A * B | float64 | 512x512 | 512x512 | 17.4131 ± 1.2841 | 6.8375 ± 0.6139 | 15.4721 ± 1.0804 | 39.4869 ± 3.2992 | 2.55x ± 0.17x | 155.47% ± 17.31% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float32 | 512x512 | 512x1 | 1.8579 ± 0.0771 | 0.2662 ± 0.0801 | 0.1411 ± 0.0057 | 1.0312 ± 0.1791 | 7.32x ± 1.28x | 632.25% ± 128.15% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float64 | 512x512 | 512x1 | 2.6229 ± 0.1116 | 0.7331 ± 0.1011 | 0.0999 ± 0.0041 | 0.3626 ± 0.0462 | 3.64x ± 0.53x | 263.98% ± 53.09% |
| matrix | matrix_sub | A - B | float32 | 512x512 | 512x512 | 0.6553 ± 0.0188 | 0.2529 ± 0.0099 | 0.4003 ± 0.0116 | 1.0379 ± 0.0391 | 2.59x ± 0.09x | 159.33% ± 9.39% |
| matrix | matrix_sub | A - B | float64 | 512x512 | 512x512 | 1.0116 ± 0.0419 | 0.8950 ± 0.0626 | 0.2596 ± 0.0117 | 0.2943 ± 0.0227 | 1.14x ± 0.10x | 13.60% ± 10.48% |
| matrix | matrix_trace | trace() | float32 | 512x512 | 1x1 | 0.0008 ± 0.0001 | 0.0009 ± 0.0001 | 0.6028 ± 0.0239 | 0.6019 ± 0.0262 | 0.99x ± 0.09x | -0.83% ± 8.67% |
| matrix | matrix_trace | trace() | float64 | 512x512 | 1x1 | 0.0011 ± 0.0001 | 0.0011 ± 0.0001 | 0.4644 ± 0.0189 | 0.4643 ± 0.0249 | 0.99x ± 0.07x | -0.63% ± 7.31% |
| matrix | matrix_transpose | transpose() | float32 | 512x512 | 512x512 | 2.2642 ± 0.1053 | 1.9411 ± 0.0744 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.17x ± 0.04x | 16.67% ± 3.86% |
| matrix | matrix_transpose | transpose() | float64 | 512x512 | 512x512 | 3.4664 ± 0.0721 | 3.6390 ± 0.3019 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.96x ± 0.08x | -4.17% ± 8.09% |
| matrix | matrix_zero | Zero() | float32 | 1x1 | 512x512 | 0.4281 ± 0.0088 | 0.0940 ± 0.0036 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 4.56x ± 0.10x | 355.52% ± 10.11% |
| matrix | matrix_zero | Zero() | float64 | 1x1 | 512x512 | 0.4941 ± 0.0179 | 0.1869 ± 0.0064 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 2.64x ± 0.07x | 164.44% ± 6.96% |
eigen-sapcemit USE BLAS VS Without BLAS
- 对比 eigen-sapcemit 使用 openblas-spacemit 作为后端和不使用之间的性能差异
- 使用 taskset -c 限制核数
- 单次测试的计时策略是每个算子跑 50 次取平均值,预热10次。本测试重复10次单次测试,取其指标的平均值并计算标准差
- no_blas 表示直接使用 eigen-spacemit 的 API
- blas 表示 eigen-spacemit 使用 openblas-spacemit 作为后端
- mean 表示 10 次测试的均值,sd 为标准差
单核对比
taskset -c 0
threads:1
| module | function | api | dtype | input_size | output_size | no_blas avg_ms mean±sd | blas avg_ms mean±sd | no_blas avg_gflops mean±sd | blas avg_gflops mean±sd | speedup mean±sd | improvement mean±sd |
|---|---|---|---|---|---|---|---|---|---|---|---|
| array | vector_abs | abs(a - scalar) | float32 | 262144x1 | 262144x1 | 0.2426 ± 0.0060 | 0.2457 ± 0.0088 | 1.0810 ± 0.0263 | 1.0679 ± 0.0374 | 0.99x ± 0.03x | -1.21% ± 2.74% |
| array | vector_abs | abs(a - scalar) | float64 | 262144x1 | 262144x1 | 0.6786 ± 0.0092 | 0.6801 ± 0.0148 | 0.3864 ± 0.0053 | 0.3856 ± 0.0083 | 1.00x ± 0.02x | -0.19% ± 1.58% |
| array | vector_add_scalar | a + scalar | float32 | 262144x1 | 262144x1 | 0.1986 ± 0.0074 | 0.2023 ± 0.0097 | 1.3213 ± 0.0472 | 1.2982 ± 0.0608 | 0.98x ± 0.03x | -1.74% ± 3.14% |
| array | vector_add_scalar | a + scalar | float64 | 262144x1 | 262144x1 | 0.6039 ± 0.0079 | 0.6084 ± 0.0252 | 0.4342 ± 0.0056 | 0.4315 ± 0.0174 | 0.99x ± 0.03x | -0.63% ± 3.43% |
| array | vector_add_vector | a + b | float32 | 262144x1 | 262144x1 | 0.2458 ± 0.0150 | 0.2509 ± 0.0205 | 1.0700 ± 0.0640 | 1.0515 ± 0.0928 | 0.99x ± 0.11x | -1.31% ± 11.42% |
| array | vector_add_vector | a + b | float64 | 262144x1 | 262144x1 | 0.9074 ± 0.0300 | 0.9024 ± 0.0319 | 0.2892 ± 0.0093 | 0.2908 ± 0.0100 | 1.01x ± 0.04x | 0.63% ± 3.81% |
| array | vector_clamp | cwiseMax + cwiseMin | float32 | 262144x1 | 262144x1 | 0.4406 ± 0.0104 | 0.4427 ± 0.0148 | 1.1905 ± 0.0277 | 1.1855 ± 0.0378 | 1.00x ± 0.02x | -0.41% ± 2.16% |
| array | vector_clamp | cwiseMax + cwiseMin | float64 | 262144x1 | 262144x1 | 1.0264 ± 0.0182 | 1.0284 ± 0.0240 | 0.5110 ± 0.0090 | 0.5101 ± 0.0118 | 1.00x ± 0.01x | -0.18% ± 0.95% |
| array | vector_cos | cos(a) | float32 | 262144x1 | 262144x1 | 2.0988 ± 0.0478 | 2.0865 ± 0.0696 | 0.1250 ± 0.0028 | 0.1258 ± 0.0040 | 1.01x ± 0.02x | 0.63% ± 2.16% |
| array | vector_cos | cos(a) | float64 | 262144x1 | 262144x1 | 10.7241 ± 0.2396 | 10.7488 ± 0.3031 | 0.0244 ± 0.0005 | 0.0244 ± 0.0007 | 1.00x ± 0.01x | -0.21% ± 0.79% |
| array | vector_div_scalar | a / scalar | float32 | 262144x1 | 262144x1 | 0.6508 ± 0.0212 | 0.6610 ± 0.0262 | 0.4032 ± 0.0126 | 0.3972 ± 0.0150 | 0.99x ± 0.02x | -1.50% ± 2.19% |
| array | vector_div_scalar | a / scalar | float64 | 262144x1 | 262144x1 | 2.3885 ± 0.0865 | 2.3830 ± 0.0969 | 0.1099 ± 0.0038 | 0.1102 ± 0.0043 | 1.00x ± 0.01x | 0.25% ± 0.67% |
| array | vector_div_vector | a / (b + scalar) | float32 | 262144x1 | 262144x1 | 0.7589 ± 0.0231 | 0.7706 ± 0.0325 | 0.6914 ± 0.0204 | 0.6815 ± 0.0280 | 0.99x ± 0.03x | -1.44% ± 3.00% |
| array | vector_div_vector | a / (b + scalar) | float64 | 262144x1 | 262144x1 | 2.5917 ± 0.0838 | 2.5770 ± 0.0674 | 0.2025 ± 0.0063 | 0.2036 ± 0.0052 | 1.01x ± 0.01x | 0.56% ± 1.03% |
| array | vector_dot | dot() | float32 | 262144x1 | 1x1 | 0.0960 ± 0.0101 | 0.0929 ± 0.0073 | 5.5139 ± 0.5420 | 5.6720 ± 0.4122 | 1.04x ± 0.11x | 3.61% ± 11.22% |
| array | vector_dot | dot() | float64 | 262144x1 | 1x1 | 0.4065 ± 0.0338 | 0.4005 ± 0.0166 | 1.2974 ± 0.1011 | 1.3110 ± 0.0539 | 1.02x ± 0.09x | 1.63% ± 9.43% |
| array | vector_exp | exp(a * scalar) | float32 | 262144x1 | 262144x1 | 2.1141 ± 0.0482 | 2.1223 ± 0.0715 | 0.2481 ± 0.0055 | 0.2473 ± 0.0078 | 1.00x ± 0.02x | -0.33% ± 2.39% |
| array | vector_exp | exp(a * scalar) | float64 | 262144x1 | 262144x1 | 6.8590 ± 0.1686 | 6.8094 ± 0.1905 | 0.0765 ± 0.0018 | 0.0770 ± 0.0021 | 1.01x ± 0.01x | 0.74% ± 0.86% |
| array | vector_fma | a * b + c | float32 | 262144x1 | 262144x1 | 0.4823 ± 0.0119 | 0.4822 ± 0.0209 | 1.0876 ± 0.0257 | 1.0891 ± 0.0451 | 1.00x ± 0.05x | 0.20% ± 5.18% |
| array | vector_fma | a * b + c | float64 | 262144x1 | 262144x1 | 1.2767 ± 0.0174 | 1.2782 ± 0.0266 | 0.4107 ± 0.0056 | 0.4103 ± 0.0084 | 1.00x ± 0.02x | -0.09% ± 2.23% |
| array | vector_log | log(a + scalar) | float32 | 262144x1 | 262144x1 | 2.0563 ± 0.0479 | 2.0593 ± 0.0679 | 0.2551 ± 0.0058 | 0.2548 ± 0.0079 | 1.00x ± 0.02x | -0.10% ± 2.24% |
| array | vector_log | log(a + scalar) | float64 | 262144x1 | 262144x1 | 6.1495 ± 0.1527 | 6.1545 ± 0.1703 | 0.0853 ± 0.0021 | 0.0852 ± 0.0023 | 1.00x ± 0.01x | -0.07% ± 1.07% |
| array | vector_max | max(a, b) | float32 | 262144x1 | 262144x1 | 0.3110 ± 0.0129 | 0.3166 ± 0.0235 | 0.8443 ± 0.0353 | 0.8321 ± 0.0613 | 0.99x ± 0.09x | -1.25% ± 8.76% |
| array | vector_max | max(a, b) | float64 | 262144x1 | 262144x1 | 0.9116 ± 0.0393 | 0.9189 ± 0.0363 | 0.2880 ± 0.0118 | 0.2857 ± 0.0110 | 0.99x ± 0.07x | -0.61% ± 6.75% |
| array | vector_min | min(a, b) | float32 | 262144x1 | 262144x1 | 0.3086 ± 0.0119 | 0.3159 ± 0.0221 | 0.8506 ± 0.0325 | 0.8336 ± 0.0581 | 0.98x ± 0.09x | -1.81% ± 8.52% |
| array | vector_min | min(a, b) | float64 | 262144x1 | 262144x1 | 0.9000 ± 0.0211 | 0.8979 ± 0.0178 | 0.2914 ± 0.0066 | 0.2920 ± 0.0057 | 1.00x ± 0.03x | 0.27% ± 3.25% |
| array | vector_mul_scalar | a * scalar | float32 | 262144x1 | 262144x1 | 0.2132 ± 0.0075 | 0.2175 ± 0.0091 | 1.2307 ± 0.0409 | 1.2070 ± 0.0500 | 0.98x ± 0.03x | -1.91% ± 3.00% |
| array | vector_mul_scalar | a * scalar | float64 | 262144x1 | 262144x1 | 0.6311 ± 0.0114 | 0.6329 ± 0.0253 | 0.4155 ± 0.0074 | 0.4148 ± 0.0161 | 1.00x ± 0.03x | -0.19% ± 3.03% |
| array | vector_mul_vector | a * b | float32 | 262144x1 | 262144x1 | 0.2604 ± 0.0170 | 0.2647 ± 0.0201 | 1.0104 ± 0.0653 | 0.9960 ± 0.0817 | 0.99x ± 0.10x | -1.07% ± 10.06% |
| array | vector_mul_vector | a * b | float64 | 262144x1 | 262144x1 | 0.9002 ± 0.0382 | 0.9071 ± 0.0341 | 0.2916 ± 0.0117 | 0.2893 ± 0.0105 | 0.99x ± 0.06x | -0.62% ± 5.91% |
| array | vector_norm | norm() | float32 | 262144x1 | 1x1 | 0.0841 ± 0.0029 | 0.0837 ± 0.0027 | 6.2425 ± 0.2041 | 6.2732 ± 0.1949 | 1.01x ± 0.03x | 0.54% ± 2.81% |
| array | vector_norm | norm() | float64 | 262144x1 | 1x1 | 0.1858 ± 0.0072 | 0.1859 ± 0.0083 | 2.8251 ± 0.1038 | 2.8258 ± 0.1227 | 1.00x ± 0.03x | 0.05% ± 3.12% |
| array | vector_normalize | normalize() | float32 | 262144x1 | 262144x1 | 0.8263 ± 0.0301 | 0.8253 ± 0.0242 | 0.9529 ± 0.0331 | 0.9536 ± 0.0270 | 1.00x ± 0.03x | 0.12% ± 2.56% |
| array | vector_normalize | normalize() | float64 | 262144x1 | 262144x1 | 2.7610 ± 0.0519 | 2.7621 ± 0.0844 | 0.2849 ± 0.0053 | 0.2850 ± 0.0084 | 1.00x ± 0.01x | -0.01% ± 1.45% |
| array | vector_segment | segment() | float32 | 262144x1 | 131072x1 | 0.0636 ± 0.0020 | 0.0626 ± 0.0013 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.02x ± 0.02x | 1.65% ± 1.87% |
| array | vector_segment | segment() | float64 | 262144x1 | 131072x1 | 0.1294 ± 0.0067 | 0.1276 ± 0.0039 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.01x ± 0.06x | 1.45% ± 6.00% |
| array | vector_select | mask.select(a, b) | float32 | 262144x1 | 262144x1 | 0.4872 ± 0.0168 | 0.4854 ± 0.0210 | 0.5387 ± 0.0184 | 0.5409 ± 0.0232 | 1.01x ± 0.05x | 0.51% ± 5.00% |
| array | vector_select | mask.select(a, b) | float64 | 262144x1 | 262144x1 | 1.1199 ± 0.0173 | 1.1256 ± 0.0231 | 0.2341 ± 0.0036 | 0.2330 ± 0.0047 | 1.00x ± 0.01x | -0.49% ± 1.32% |
| array | vector_sin | sin(a) | float32 | 262144x1 | 262144x1 | 2.0844 ± 0.0453 | 2.1151 ± 0.0676 | 0.1258 ± 0.0027 | 0.1240 ± 0.0037 | 0.99x ± 0.02x | -1.41% ± 2.09% |
| array | vector_sin | sin(a) | float64 | 262144x1 | 262144x1 | 10.9153 ± 0.3224 | 10.9188 ± 0.3461 | 0.0240 ± 0.0007 | 0.0240 ± 0.0007 | 1.00x ± 0.01x | -0.02% ± 0.91% |
| array | vector_sqrt | (a + scalar).sqrt() | float32 | 262144x1 | 262144x1 | 0.6227 ± 0.0137 | 0.6263 ± 0.0216 | 0.8423 ± 0.0182 | 0.8380 ± 0.0275 | 0.99x ± 0.02x | -0.52% ± 2.16% |
| array | vector_sqrt | (a + scalar).sqrt() | float64 | 262144x1 | 262144x1 | 2.3245 ± 0.0733 | 2.3158 ± 0.0565 | 0.2258 ± 0.0068 | 0.2265 ± 0.0054 | 1.00x ± 0.02x | 0.37% ± 1.53% |
| array | vector_sub_scalar | a - scalar | float32 | 262144x1 | 262144x1 | 0.1983 ± 0.0064 | 0.2024 ± 0.0087 | 1.3230 ± 0.0413 | 1.2975 ± 0.0546 | 0.98x ± 0.03x | -1.92% ± 2.97% |
| array | vector_sub_scalar | a - scalar | float64 | 262144x1 | 262144x1 | 0.6066 ± 0.0098 | 0.6093 ± 0.0258 | 0.4323 ± 0.0069 | 0.4309 ± 0.0178 | 1.00x ± 0.04x | -0.30% ± 3.76% |
| array | vector_sub_vector | a - b | float32 | 262144x1 | 262144x1 | 0.2453 ± 0.0149 | 0.2508 ± 0.0207 | 1.0722 ± 0.0640 | 1.0523 ± 0.0942 | 0.99x ± 0.12x | -1.47% ± 11.50% |
| array | vector_sub_vector | a - b | float64 | 262144x1 | 262144x1 | 0.8995 ± 0.0200 | 0.9162 ± 0.0359 | 0.2916 ± 0.0064 | 0.2866 ± 0.0112 | 0.98x ± 0.03x | -1.73% ± 3.19% |
| array | vector_sum | sum() | float32 | 262144x1 | 1x1 | 0.0454 ± 0.0017 | 0.0446 ± 0.0016 | 5.7800 ± 0.2011 | 5.8800 ± 0.1962 | 1.02x ± 0.03x | 1.78% ± 2.88% |
| array | vector_sum | sum() | float64 | 262144x1 | 1x1 | 0.0920 ± 0.0054 | 0.0924 ± 0.0053 | 2.8561 ± 0.1551 | 2.8450 ± 0.1572 | 1.00x ± 0.06x | -0.22% ± 5.88% |
| array | vector_tanh | tanh(a * scalar) | float32 | 262144x1 | 262144x1 | 1.2219 ± 0.0283 | 1.2256 ± 0.0403 | 0.4293 ± 0.0098 | 0.4282 ± 0.0134 | 1.00x ± 0.02x | -0.26% ± 2.17% |
| array | vector_tanh | tanh(a * scalar) | float64 | 262144x1 | 262144x1 | 15.4090 ± 0.4466 | 15.4376 ± 0.4939 | 0.0340 ± 0.0010 | 0.0340 ± 0.0010 | 1.00x ± 0.01x | -0.18% ± 0.64% |
| geometry | quaternion_inverse | Quaternion::inverse() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0990 ± 0.0044 | 0.1104 ± 0.0038 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_inverse | Quaternion::inverse() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0717 ± 0.0025 | 0.0735 ± 0.0034 | 0.95x ± 0.16x | -5.00% ± 15.81% |
| geometry | quaternion_normalize | Quaternion::normalize() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1138 ± 0.0048 | 0.1290 ± 0.0054 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0833 ± 0.0025 | 0.0868 ± 0.0031 | 1.10x ± 0.32x | 10.00% ± 31.62% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float32 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.2749 ± 0.0120 | 0.2995 ± 0.0140 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float64 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.2697 ± 0.0137 | 0.2985 ± 0.0120 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1120 ± 0.0051 | 0.1296 ± 0.0033 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1140 ± 0.0036 | 0.1295 ± 0.0051 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_add | A + B | float32 | 512x512 | 512x512 | 0.2503 ± 0.0110 | 0.2512 ± 0.0131 | 1.0492 ± 0.0451 | 1.0459 ± 0.0529 | 1.00x ± 0.06x | -0.20% ± 5.60% |
| matrix | matrix_add | A + B | float64 | 512x512 | 512x512 | 0.9127 ± 0.0427 | 0.9066 ± 0.0351 | 0.2877 ± 0.0130 | 0.2895 ± 0.0109 | 1.01x ± 0.06x | 0.80% ± 5.88% |
| matrix | matrix_block | block() | float32 | 512x512 | 256x256 | 0.0337 ± 0.0011 | 0.0341 ± 0.0015 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.99x ± 0.02x | -1.09% ± 1.86% |
| matrix | matrix_block | block() | float64 | 512x512 | 256x256 | 0.0642 ± 0.0020 | 0.0646 ± 0.0025 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.99x ± 0.02x | -0.59% ± 2.04% |
| matrix | matrix_colwise_sum | colwise().sum() | float32 | 512x512 | 1x512 | 0.0472 ± 0.0016 | 0.0469 ± 0.0012 | 5.5489 ± 0.1786 | 5.5816 ± 0.1347 | 1.01x ± 0.02x | 0.63% ± 1.58% |
| matrix | matrix_colwise_sum | colwise().sum() | float64 | 512x512 | 1x512 | 0.0940 ± 0.0045 | 0.0938 ± 0.0048 | 2.7882 ± 0.1299 | 2.7949 ± 0.1357 | 1.00x ± 0.07x | 0.44% ± 6.69% |
| matrix | matrix_cwise_product | cwiseProduct | float32 | 512x512 | 512x512 | 0.2626 ± 0.0111 | 0.2622 ± 0.0105 | 1.0001 ± 0.0423 | 1.0013 ± 0.0398 | 1.00x ± 0.05x | 0.23% ± 4.62% |
| matrix | matrix_cwise_product | cwiseProduct | float64 | 512x512 | 512x512 | 0.8996 ± 0.0318 | 0.9034 ± 0.0385 | 0.2917 ± 0.0102 | 0.2906 ± 0.0119 | 1.00x ± 0.06x | -0.27% ± 5.56% |
| matrix | matrix_determinant | determinant() | float32 | 512x512 | 1x1 | 14.6256 ± 0.4043 | 8.9489 ± 0.2659 | 6.1220 ± 0.1651 | 10.0065 ± 0.2866 | 1.63x ± 0.02x | 63.45% ± 1.83% |
| matrix | matrix_determinant | determinant() | float64 | 512x512 | 1x1 | 25.5483 ± 0.7610 | 14.4550 ± 0.5234 | 3.5051 ± 0.1018 | 6.1972 ± 0.2169 | 1.77x ± 0.02x | 76.79% ± 1.89% |
| matrix | matrix_gemv | A * x | float32 | 512x512 | 512x1 | 0.0796 ± 0.0027 | 0.1093 ± 0.0024 | 6.5897 ± 0.2140 | 4.7949 ± 0.1043 | 0.73x ± 0.01x | -27.21% ± 1.24% |
| matrix | matrix_gemv | A * x | float64 | 512x512 | 512x1 | 0.1840 ± 0.0083 | 0.2257 ± 0.0158 | 2.8515 ± 0.1235 | 2.3304 ± 0.1577 | 0.82x ± 0.05x | -18.24% ± 4.86% |
| matrix | matrix_identity | Identity() | float32 | 1x1 | 512x512 | 0.3504 ± 0.0119 | 0.3808 ± 0.0123 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.92x ± 0.02x | -7.98% ± 2.21% |
| matrix | matrix_identity | Identity() | float64 | 1x1 | 512x512 | 0.3988 ± 0.0148 | 0.4305 ± 0.0188 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.93x ± 0.02x | -7.33% ± 1.66% |
| matrix | matrix_inverse | inverse() | float32 | 512x512 | 512x512 | 58.6058 ± 1.6097 | 35.6504 ± 0.8409 | 4.5834 ± 0.1225 | 7.5333 ± 0.1717 | 1.64x ± 0.02x | 64.39% ± 2.29% |
| matrix | matrix_inverse | inverse() | float64 | 512x512 | 512x512 | 102.4444 ± 2.8414 | 52.7110 ± 1.6649 | 2.6221 ± 0.0707 | 5.0970 ± 0.1557 | 1.94x ± 0.01x | 94.37% ± 1.36% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float32 | 512x512 | 512x1 | 0.1428 ± 0.0041 | 0.1392 ± 0.0067 | 3.6731 ± 0.1037 | 3.7733 ± 0.1742 | 1.03x ± 0.02x | 2.70% ± 2.44% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float64 | 512x512 | 512x1 | 0.2893 ± 0.0104 | 0.2291 ± 0.0048 | 1.8146 ± 0.0635 | 2.2898 ± 0.0469 | 1.26x ± 0.03x | 26.26% ± 2.50% |
| matrix | matrix_llt_solve | LLT::solve(x) | float32 | 512x512 | 512x1 | 0.1477 ± 0.0032 | 0.1441 ± 0.0071 | 3.5506 ± 0.0759 | 3.6474 ± 0.1738 | 1.03x ± 0.03x | 2.67% ± 2.82% |
| matrix | matrix_llt_solve | LLT::solve(x) | float64 | 512x512 | 512x1 | 0.2913 ± 0.0111 | 0.2313 ± 0.0051 | 1.8022 ± 0.0653 | 2.2674 ± 0.0498 | 1.26x ± 0.03x | 25.90% ± 3.10% |
| matrix | matrix_matmul | A * B | float32 | 512x512 | 512x512 | 22.2456 ± 0.5236 | 9.3863 ± 0.3394 | 12.0610 ± 0.2787 | 28.6032 ± 1.0011 | 2.37x ± 0.03x | 137.10% ± 3.41% |
| matrix | matrix_matmul | A * B | float64 | 512x512 | 512x512 | 48.6433 ± 1.3853 | 24.6871 ± 0.6813 | 5.5170 ± 0.1528 | 10.8702 ± 0.2933 | 1.97x ± 0.01x | 97.04% ± 1.34% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float32 | 512x512 | 512x1 | 0.2364 ± 0.0076 | 0.2372 ± 0.0062 | 1.1077 ± 0.0343 | 1.1035 ± 0.0283 | 1.00x ± 0.02x | -0.35% ± 1.93% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float64 | 512x512 | 512x1 | 0.6596 ± 0.0482 | 0.6753 ± 0.0792 | 0.3983 ± 0.0264 | 0.3914 ± 0.0376 | 0.99x ± 0.12x | -1.27% ± 12.09% |
| matrix | matrix_sub | A - B | float32 | 512x512 | 512x512 | 0.2532 ± 0.0114 | 0.2513 ± 0.0103 | 1.0372 ± 0.0454 | 1.0447 ± 0.0425 | 1.01x ± 0.05x | 0.86% ± 5.46% |
| matrix | matrix_sub | A - B | float64 | 512x512 | 512x512 | 0.9192 ± 0.0440 | 0.9067 ± 0.0432 | 0.2858 ± 0.0136 | 0.2897 ± 0.0135 | 1.02x ± 0.09x | 1.70% ± 8.57% |
| matrix | matrix_trace | trace() | float32 | 512x512 | 1x1 | 0.0008 ± 0.0000 | 0.0008 ± 0.0000 | 0.6114 ± 0.0214 | 0.6266 ± 0.0149 | 1.04x ± 0.06x | 3.75% ± 6.04% |
| matrix | matrix_trace | trace() | float64 | 512x512 | 1x1 | 0.0011 ± 0.0000 | 0.0011 ± 0.0001 | 0.4692 ± 0.0192 | 0.4796 ± 0.0116 | 1.06x ± 0.05x | 5.82% ± 5.02% |
| matrix | matrix_transpose | transpose() | float32 | 512x512 | 512x512 | 1.9027 ± 0.0676 | 1.8776 ± 0.0508 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.01x ± 0.02x | 1.33% ± 1.91% |
| matrix | matrix_transpose | transpose() | float64 | 512x512 | 512x512 | 3.4747 ± 0.1341 | 3.5373 ± 0.2039 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.98x ± 0.06x | -1.52% ± 5.97% |
| matrix | matrix_zero | Zero() | float32 | 1x1 | 512x512 | 0.0925 ± 0.0032 | 0.0923 ± 0.0031 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.03x | 0.25% ± 2.73% |
| matrix | matrix_zero | Zero() | float64 | 1x1 | 512x512 | 0.1882 ± 0.0095 | 0.1882 ± 0.0106 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.05x | 0.14% ± 5.10% |
四核对比
taskset -c 0-3
threads:4
| module | function | api | dtype | input_size | output_size | no_blas avg_ms mean±sd | blas avg_ms mean±sd | no_blas avg_gflops mean±sd | blas avg_gflops mean±sd | speedup mean±sd | improvement mean±sd |
|---|---|---|---|---|---|---|---|---|---|---|---|
| array | vector_abs | abs(a - scalar) | float32 | 262144x1 | 262144x1 | 0.2416 ± 0.0051 | 0.2392 ± 0.0011 | 1.0857 ± 0.0224 | 1.0958 ± 0.0050 | 1.01x ± 0.02x | 0.98% ± 2.31% |
| array | vector_abs | abs(a - scalar) | float64 | 262144x1 | 262144x1 | 0.6711 ± 0.0086 | 0.6737 ± 0.0087 | 0.3907 ± 0.0050 | 0.3891 ± 0.0049 | 1.00x ± 0.01x | -0.39% ± 0.93% |
| array | vector_add_scalar | a + scalar | float32 | 262144x1 | 262144x1 | 0.1981 ± 0.0060 | 0.1955 ± 0.0039 | 1.3242 ± 0.0387 | 1.3413 ± 0.0258 | 1.01x ± 0.04x | 1.37% ± 3.89% |
| array | vector_add_scalar | a + scalar | float64 | 262144x1 | 262144x1 | 0.5992 ± 0.0114 | 0.6036 ± 0.0129 | 0.4376 ± 0.0083 | 0.4345 ± 0.0092 | 0.99x ± 0.02x | -0.71% ± 2.05% |
| array | vector_add_vector | a + b | float32 | 262144x1 | 262144x1 | 0.2482 ± 0.0162 | 0.2472 ± 0.0172 | 1.0601 ± 0.0695 | 1.0652 ± 0.0735 | 1.01x ± 0.09x | 0.81% ± 8.91% |
| array | vector_add_vector | a + b | float64 | 262144x1 | 262144x1 | 0.8884 ± 0.0304 | 0.9132 ± 0.0334 | 0.2954 ± 0.0097 | 0.2874 ± 0.0106 | 0.97x ± 0.05x | -2.60% ± 4.79% |
| array | vector_clamp | cwiseMax + cwiseMin | float32 | 262144x1 | 262144x1 | 0.4353 ± 0.0044 | 0.4329 ± 0.0011 | 1.2044 ± 0.0122 | 1.2110 ± 0.0030 | 1.01x ± 0.01x | 0.55% ± 1.06% |
| array | vector_clamp | cwiseMax + cwiseMin | float64 | 262144x1 | 262144x1 | 1.0154 ± 0.0089 | 1.0145 ± 0.0101 | 0.5164 ± 0.0045 | 0.5168 ± 0.0051 | 1.00x ± 0.01x | 0.10% ± 0.88% |
| array | vector_cos | cos(a) | float32 | 262144x1 | 262144x1 | 2.0710 ± 0.0057 | 2.0510 ± 0.0047 | 0.1266 ± 0.0004 | 0.1278 ± 0.0003 | 1.01x ± 0.00x | 0.98% ± 0.32% |
| array | vector_cos | cos(a) | float64 | 262144x1 | 262144x1 | 10.5539 ± 0.0189 | 10.5530 ± 0.0136 | 0.0248 ± 0.0000 | 0.0248 ± 0.0000 | 1.00x ± 0.00x | 0.01% ± 0.19% |
| array | vector_div_scalar | a / scalar | float32 | 262144x1 | 262144x1 | 0.6404 ± 0.0043 | 0.6442 ± 0.0084 | 0.4094 ± 0.0027 | 0.4070 ± 0.0052 | 0.99x ± 0.02x | -0.57% ± 1.66% |
| array | vector_div_scalar | a / scalar | float64 | 262144x1 | 262144x1 | 2.3229 ± 0.0110 | 2.3314 ± 0.0146 | 0.1129 ± 0.0005 | 0.1124 ± 0.0007 | 1.00x ± 0.00x | -0.36% ± 0.48% |
| array | vector_div_vector | a / (b + scalar) | float32 | 262144x1 | 262144x1 | 0.7443 ± 0.0095 | 0.7498 ± 0.0110 | 0.7045 ± 0.0090 | 0.6994 ± 0.0103 | 0.99x ± 0.02x | -0.71% ± 1.78% |
| array | vector_div_vector | a / (b + scalar) | float64 | 262144x1 | 262144x1 | 2.5419 ± 0.0166 | 2.5347 ± 0.0094 | 0.2063 ± 0.0014 | 0.2069 ± 0.0008 | 1.00x ± 0.01x | 0.29% ± 0.52% |
| array | vector_dot | dot() | float32 | 262144x1 | 1x1 | 0.0937 ± 0.0090 | 0.0959 ± 0.0109 | 5.6377 ± 0.5052 | 5.5242 ± 0.5756 | 0.99x ± 0.14x | -1.20% ± 14.36% |
| array | vector_dot | dot() | float64 | 262144x1 | 1x1 | 0.4170 ± 0.0202 | 0.3983 ± 0.0125 | 1.2601 ± 0.0617 | 1.3175 ± 0.0411 | 1.05x ± 0.08x | 4.88% ± 7.62% |
| array | vector_exp | exp(a * scalar) | float32 | 262144x1 | 262144x1 | 2.0859 ± 0.0049 | 2.0883 ± 0.0097 | 0.2513 ± 0.0006 | 0.2511 ± 0.0012 | 1.00x ± 0.01x | -0.11% ± 0.64% |
| array | vector_exp | exp(a * scalar) | float64 | 262144x1 | 262144x1 | 6.7441 ± 0.0091 | 6.6802 ± 0.0097 | 0.0777 ± 0.0001 | 0.0785 ± 0.0001 | 1.01x ± 0.00x | 0.96% ± 0.16% |
| array | vector_fma | a * b + c | float32 | 262144x1 | 262144x1 | 0.4809 ± 0.0120 | 0.4727 ± 0.0191 | 1.0909 ± 0.0276 | 1.1106 ± 0.0442 | 1.02x ± 0.05x | 1.86% ± 4.59% |
| array | vector_fma | a * b + c | float64 | 262144x1 | 262144x1 | 1.3205 ± 0.0267 | 1.2779 ± 0.0266 | 0.3972 ± 0.0082 | 0.4104 ± 0.0083 | 1.03x ± 0.03x | 3.39% ± 3.49% |
| array | vector_log | log(a + scalar) | float32 | 262144x1 | 262144x1 | 2.0275 ± 0.0035 | 2.0242 ± 0.0018 | 0.2586 ± 0.0004 | 0.2590 ± 0.0002 | 1.00x ± 0.00x | 0.16% ± 0.24% |
| array | vector_log | log(a + scalar) | float64 | 262144x1 | 262144x1 | 6.0402 ± 0.0110 | 6.0428 ± 0.0042 | 0.0868 ± 0.0002 | 0.0867 ± 0.0001 | 1.00x ± 0.00x | -0.04% ± 0.18% |
| array | vector_max | max(a, b) | float32 | 262144x1 | 262144x1 | 0.3140 ± 0.0156 | 0.3132 ± 0.0126 | 0.8368 ± 0.0413 | 0.8381 ± 0.0327 | 1.00x ± 0.06x | 0.38% ± 6.43% |
| array | vector_max | max(a, b) | float64 | 262144x1 | 262144x1 | 0.9226 ± 0.0392 | 0.9106 ± 0.0327 | 0.2846 ± 0.0119 | 0.2882 ± 0.0102 | 1.02x ± 0.07x | 1.52% ± 7.27% |
| array | vector_min | min(a, b) | float32 | 262144x1 | 262144x1 | 0.3115 ± 0.0134 | 0.3140 ± 0.0160 | 0.8430 ± 0.0359 | 0.8369 ± 0.0422 | 0.99x ± 0.06x | -0.60% ± 5.86% |
| array | vector_min | min(a, b) | float64 | 262144x1 | 262144x1 | 0.9007 ± 0.0235 | 0.8977 ± 0.0200 | 0.2912 ± 0.0073 | 0.2921 ± 0.0063 | 1.00x ± 0.04x | 0.38% ± 3.61% |
| array | vector_mul_scalar | a * scalar | float32 | 262144x1 | 262144x1 | 0.2125 ± 0.0057 | 0.2087 ± 0.0005 | 1.2342 ± 0.0324 | 1.2560 ± 0.0032 | 1.02x ± 0.03x | 1.84% ± 2.85% |
| array | vector_mul_scalar | a * scalar | float64 | 262144x1 | 262144x1 | 0.6229 ± 0.0096 | 0.6244 ± 0.0117 | 0.4210 ± 0.0065 | 0.4200 ± 0.0078 | 1.00x ± 0.02x | -0.22% ± 1.89% |
| array | vector_mul_vector | a * b | float32 | 262144x1 | 262144x1 | 0.2597 ± 0.0143 | 0.2584 ± 0.0164 | 1.0121 ± 0.0562 | 1.0180 ± 0.0640 | 1.01x ± 0.08x | 0.83% ± 7.96% |
| array | vector_mul_vector | a * b | float64 | 262144x1 | 262144x1 | 0.9140 ± 0.0364 | 0.9077 ± 0.0335 | 0.2872 ± 0.0114 | 0.2892 ± 0.0106 | 1.01x ± 0.06x | 0.83% ± 5.81% |
| array | vector_norm | norm() | float32 | 262144x1 | 1x1 | 0.0824 ± 0.0002 | 0.0823 ± 0.0001 | 6.3630 ± 0.0172 | 6.3693 ± 0.0096 | 1.00x ± 0.00x | 0.07% ± 0.33% |
| array | vector_norm | norm() | float64 | 262144x1 | 1x1 | 0.1824 ± 0.0056 | 0.1816 ± 0.0046 | 2.8773 ± 0.0837 | 2.8883 ± 0.0691 | 1.00x ± 0.04x | 0.48% ± 4.17% |
| array | vector_normalize | normalize() | float32 | 262144x1 | 262144x1 | 0.8117 ± 0.0062 | 0.8099 ± 0.0019 | 0.9690 ± 0.0073 | 0.9711 ± 0.0022 | 1.00x ± 0.01x | 0.22% ± 0.89% |
| array | vector_normalize | normalize() | float64 | 262144x1 | 262144x1 | 2.7192 ± 0.0094 | 2.7161 ± 0.0083 | 0.2892 ± 0.0010 | 0.2895 ± 0.0009 | 1.00x ± 0.00x | 0.11% ± 0.45% |
| array | vector_segment | segment() | float32 | 262144x1 | 131072x1 | 0.0624 ± 0.0004 | 0.0623 ± 0.0002 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.01x | 0.13% ± 0.75% |
| array | vector_segment | segment() | float64 | 262144x1 | 131072x1 | 0.1268 ± 0.0050 | 0.1264 ± 0.0047 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.01x ± 0.06x | 0.50% ± 5.83% |
| array | vector_select | mask.select(a, b) | float32 | 262144x1 | 262144x1 | 0.4819 ± 0.0190 | 0.4808 ± 0.0130 | 0.5447 ± 0.0205 | 0.5456 ± 0.0145 | 1.00x ± 0.05x | 0.29% ± 4.98% |
| array | vector_select | mask.select(a, b) | float64 | 262144x1 | 262144x1 | 1.1194 ± 0.0152 | 1.1066 ± 0.0102 | 0.2342 ± 0.0032 | 0.2369 ± 0.0021 | 1.01x ± 0.02x | 1.17% ± 2.05% |
| array | vector_sin | sin(a) | float32 | 262144x1 | 262144x1 | 2.0531 ± 0.0053 | 2.0818 ± 0.0052 | 0.1277 ± 0.0003 | 0.1259 ± 0.0003 | 0.99x ± 0.00x | -1.38% ± 0.41% |
| array | vector_sin | sin(a) | float64 | 262144x1 | 262144x1 | 10.7043 ± 0.0138 | 10.7054 ± 0.0090 | 0.0245 ± 0.0000 | 0.0245 ± 0.0000 | 1.00x ± 0.00x | -0.01% ± 0.15% |
| array | vector_sqrt | (a + scalar).sqrt() | float32 | 262144x1 | 262144x1 | 0.6149 ± 0.0045 | 0.6135 ± 0.0018 | 0.8527 ± 0.0061 | 0.8546 ± 0.0025 | 1.00x ± 0.01x | 0.23% ± 0.85% |
| array | vector_sqrt | (a + scalar).sqrt() | float64 | 262144x1 | 262144x1 | 2.2786 ± 0.0086 | 2.2822 ± 0.0073 | 0.2301 ± 0.0009 | 0.2298 ± 0.0007 | 1.00x ± 0.00x | -0.16% ± 0.41% |
| array | vector_sub_scalar | a - scalar | float32 | 262144x1 | 262144x1 | 0.1981 ± 0.0055 | 0.1943 ± 0.0013 | 1.3245 ± 0.0359 | 1.3489 ± 0.0090 | 1.02x ± 0.03x | 1.92% ± 3.18% |
| array | vector_sub_scalar | a - scalar | float64 | 262144x1 | 262144x1 | 0.6015 ± 0.0122 | 0.6018 ± 0.0137 | 0.4360 ± 0.0088 | 0.4358 ± 0.0097 | 1.00x ± 0.02x | -0.02% ± 2.36% |
| array | vector_sub_vector | a - b | float32 | 262144x1 | 262144x1 | 0.2478 ± 0.0146 | 0.2471 ± 0.0170 | 1.0612 ± 0.0633 | 1.0653 ± 0.0734 | 1.01x ± 0.09x | 0.67% ± 8.65% |
| array | vector_sub_vector | a - b | float64 | 262144x1 | 262144x1 | 0.9075 ± 0.0381 | 0.9062 ± 0.0361 | 0.2893 ± 0.0120 | 0.2897 ± 0.0115 | 1.00x ± 0.07x | 0.34% ± 6.70% |
| array | vector_sum | sum() | float32 | 262144x1 | 1x1 | 0.0440 ± 0.0003 | 0.0440 ± 0.0004 | 5.9621 ± 0.0391 | 5.9556 ± 0.0476 | 1.00x ± 0.01x | -0.16% ± 0.78% |
| array | vector_sum | sum() | float64 | 262144x1 | 1x1 | 0.0901 ± 0.0054 | 0.0896 ± 0.0043 | 2.9172 ± 0.1565 | 2.9326 ± 0.1269 | 1.01x ± 0.08x | 0.85% ± 7.77% |
| array | vector_tanh | tanh(a * scalar) | float32 | 262144x1 | 262144x1 | 1.2058 ± 0.0058 | 1.1980 ± 0.0020 | 0.4348 ± 0.0021 | 0.4376 ± 0.0007 | 1.01x ± 0.01x | 0.65% ± 0.61% |
| array | vector_tanh | tanh(a * scalar) | float64 | 262144x1 | 262144x1 | 15.1154 ± 0.0124 | 15.1210 ± 0.0172 | 0.0347 ± 0.0000 | 0.0347 ± 0.0000 | 1.00x ± 0.00x | -0.04% ± 0.12% |
| geometry | quaternion_inverse | Quaternion::inverse() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1016 ± 0.0019 | 0.1128 ± 0.0026 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_inverse | Quaternion::inverse() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0733 ± 0.0007 | 0.0749 ± 0.0005 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1156 ± 0.0015 | 0.1277 ± 0.0041 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0843 ± 0.0020 | 0.0888 ± 0.0013 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float32 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.2782 ± 0.0096 | 0.3108 ± 0.0062 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float64 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.2822 ± 0.0259 | 0.3023 ± 0.0051 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1125 ± 0.0021 | 0.1302 ± 0.0022 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1142 ± 0.0035 | 0.1315 ± 0.0035 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_add | A + B | float32 | 512x512 | 512x512 | 0.2496 ± 0.0168 | 0.2487 ± 0.0152 | 1.0548 ± 0.0753 | 1.0573 ± 0.0631 | 1.01x ± 0.08x | 0.56% ± 7.64% |
| matrix | matrix_add | A + B | float64 | 512x512 | 512x512 | 0.8835 ± 0.0266 | 0.8924 ± 0.0257 | 0.2969 ± 0.0087 | 0.2940 ± 0.0082 | 0.99x ± 0.04x | -0.94% ± 3.62% |
| matrix | matrix_block | block() | float32 | 512x512 | 256x256 | 0.0334 ± 0.0003 | 0.0333 ± 0.0004 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.01x | 0.49% ± 1.17% |
| matrix | matrix_block | block() | float64 | 512x512 | 256x256 | 0.0630 ± 0.0002 | 0.0631 ± 0.0005 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.01x | -0.08% ± 0.65% |
| matrix | matrix_colwise_sum | colwise().sum() | float32 | 512x512 | 1x512 | 0.0463 ± 0.0002 | 0.0462 ± 0.0002 | 5.6552 ± 0.0232 | 5.6621 ± 0.0187 | 1.00x ± 0.00x | 0.15% ± 0.45% |
| matrix | matrix_colwise_sum | colwise().sum() | float64 | 512x512 | 1x512 | 0.0928 ± 0.0032 | 0.0929 ± 0.0041 | 2.8215 ± 0.0953 | 2.8198 ± 0.1170 | 1.00x ± 0.06x | 0.10% ± 6.48% |
| matrix | matrix_cwise_product | cwiseProduct | float32 | 512x512 | 512x512 | 0.2625 ± 0.0148 | 0.2615 ± 0.0144 | 1.0016 ± 0.0584 | 1.0053 ± 0.0537 | 1.01x ± 0.06x | 0.55% ± 6.04% |
| matrix | matrix_cwise_product | cwiseProduct | float64 | 512x512 | 512x512 | 0.8918 ± 0.0423 | 0.8939 ± 0.0253 | 0.2945 ± 0.0135 | 0.2935 ± 0.0080 | 1.00x ± 0.05x | -0.20% ± 4.65% |
| matrix | matrix_determinant | determinant() | float32 | 512x512 | 1x1 | 10.5614 ± 0.0747 | 5.5022 ± 0.0131 | 8.4726 ± 0.0593 | 16.2622 ± 0.0386 | 1.92x ± 0.01x | 91.95% ± 1.39% |
| matrix | matrix_determinant | determinant() | float64 | 512x512 | 1x1 | 17.0516 ± 0.1539 | 9.4279 ± 0.1019 | 5.2479 ± 0.0474 | 9.4918 ± 0.1023 | 1.81x ± 0.03x | 80.88% ± 2.54% |
| matrix | matrix_gemv | A * x | float32 | 512x512 | 512x1 | 0.0784 ± 0.0007 | 0.1082 ± 0.0004 | 6.6805 ± 0.0594 | 4.8415 ± 0.0170 | 0.72x ± 0.01x | -27.52% ± 0.55% |
| matrix | matrix_gemv | A * x | float64 | 512x512 | 512x1 | 0.1802 ± 0.0033 | 0.2180 ± 0.0106 | 2.9076 ± 0.0515 | 2.4073 ± 0.1092 | 0.83x ± 0.04x | -17.17% ± 4.31% |
| matrix | matrix_identity | Identity() | float32 | 1x1 | 512x512 | 0.3432 ± 0.0005 | 0.3741 ± 0.0006 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.92x ± 0.00x | -8.25% ± 0.23% |
| matrix | matrix_identity | Identity() | float64 | 1x1 | 512x512 | 0.3904 ± 0.0060 | 0.4230 ± 0.0047 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.92x ± 0.02x | -7.71% ± 1.63% |
| matrix | matrix_inverse | inverse() | float32 | 512x512 | 512x512 | 51.1701 ± 0.0814 | 17.7917 ± 0.0713 | 5.2460 ± 0.0083 | 15.0879 ± 0.0603 | 2.88x ± 0.01x | 187.61% ± 1.33% |
| matrix | matrix_inverse | inverse() | float64 | 512x512 | 512x512 | 89.4104 ± 0.1895 | 28.1555 ± 0.1274 | 3.0023 ± 0.0064 | 9.5342 ± 0.0431 | 3.18x ± 0.01x | 217.56% ± 1.30% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float32 | 512x512 | 512x1 | 0.1406 ± 0.0007 | 0.1352 ± 0.0010 | 3.7295 ± 0.0172 | 3.8787 ± 0.0288 | 1.04x ± 0.01x | 4.01% ± 1.09% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float64 | 512x512 | 512x1 | 0.2820 ± 0.0019 | 0.2273 ± 0.0010 | 1.8591 ± 0.0122 | 2.3067 ± 0.0103 | 1.24x ± 0.01x | 24.09% ± 0.95% |
| matrix | matrix_llt_solve | LLT::solve(x) | float32 | 512x512 | 512x1 | 0.1459 ± 0.0014 | 0.1401 ± 0.0009 | 3.5931 ± 0.0331 | 3.7411 ± 0.0233 | 1.04x ± 0.01x | 4.12% ± 1.13% |
| matrix | matrix_llt_solve | LLT::solve(x) | float64 | 512x512 | 512x1 | 0.2869 ± 0.0022 | 0.2304 ± 0.0022 | 1.8277 ± 0.0137 | 2.2758 ± 0.0218 | 1.25x ± 0.02x | 24.52% ± 1.68% |
| matrix | matrix_matmul | A * B | float32 | 512x512 | 512x512 | 5.6547 ± 0.0307 | 3.1467 ± 0.0362 | 47.4266 ± 0.2580 | 85.2327 ± 0.9693 | 1.80x ± 0.02x | 79.72% ± 2.27% |
| matrix | matrix_matmul | A * B | float64 | 512x512 | 512x512 | 12.3670 ± 0.0774 | 7.0604 ± 0.0411 | 21.6854 ± 0.1353 | 37.9837 ± 0.2203 | 1.75x ± 0.01x | 75.16% ± 1.40% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float32 | 512x512 | 512x1 | 0.2312 ± 0.0013 | 0.2334 ± 0.0012 | 1.1316 ± 0.0062 | 1.1208 ± 0.0056 | 0.99x ± 0.01x | -0.94% ± 0.85% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float64 | 512x512 | 512x1 | 0.6573 ± 0.0552 | 0.6698 ± 0.0789 | 0.4003 ± 0.0300 | 0.3948 ± 0.0396 | 0.99x ± 0.15x | -0.58% ± 14.87% |
| matrix | matrix_sub | A - B | float32 | 512x512 | 512x512 | 0.2495 ± 0.0144 | 0.2498 ± 0.0153 | 1.0540 ± 0.0636 | 1.0526 ± 0.0625 | 1.00x ± 0.06x | 0.05% ± 6.31% |
| matrix | matrix_sub | A - B | float64 | 512x512 | 512x512 | 0.8966 ± 0.0476 | 0.8820 ± 0.0110 | 0.2931 ± 0.0146 | 0.2972 ± 0.0037 | 1.02x ± 0.06x | 1.67% ± 5.66% |
| matrix | matrix_trace | trace() | float32 | 512x512 | 1x1 | 0.0008 ± 0.0000 | 0.0008 ± 0.0000 | 0.6198 ± 0.0058 | 0.6326 ± 0.0075 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_trace | trace() | float64 | 512x512 | 1x1 | 0.0011 ± 0.0000 | 0.0011 ± 0.0001 | 0.4794 ± 0.0054 | 0.4864 ± 0.0032 | 1.04x ± 0.05x | 4.00% ± 5.16% |
| matrix | matrix_transpose | transpose() | float32 | 512x512 | 512x512 | 1.8550 ± 0.0161 | 1.8488 ± 0.0118 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.01x | 0.34% ± 1.21% |
| matrix | matrix_transpose | transpose() | float64 | 512x512 | 512x512 | 3.4719 ± 0.1458 | 3.4733 ± 0.1662 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.07x | 0.21% ± 7.01% |
| matrix | matrix_zero | Zero() | float32 | 1x1 | 512x512 | 0.0907 ± 0.0002 | 0.0910 ± 0.0003 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.00x | -0.26% ± 0.36% |
| matrix | matrix_zero | Zero() | float64 | 1x1 | 512x512 | 0.1859 ± 0.0072 | 0.1858 ± 0.0051 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.04x | 0.07% ± 4.06% |
八核对比
taskset -c 0-7
threads:8
| module | function | api | dtype | input_size | output_size | no_blas avg_ms mean±sd | blas avg_ms mean±sd | no_blas avg_gflops mean±sd | blas avg_gflops mean±sd | speedup mean±sd | improvement mean±sd |
|---|---|---|---|---|---|---|---|---|---|---|---|
| array | vector_abs | abs(a - scalar) | float32 | 262144x1 | 262144x1 | 0.2215 ± 0.0044 | 0.2218 ± 0.0042 | 1.1841 ± 0.0226 | 1.1821 ± 0.0220 | 1.00x ± 0.03x | -0.13% ± 3.27% |
| array | vector_abs | abs(a - scalar) | float64 | 262144x1 | 262144x1 | 0.6470 ± 0.0127 | 0.6327 ± 0.0088 | 0.4053 ± 0.0079 | 0.4144 ± 0.0057 | 1.02x ± 0.02x | 2.26% ± 1.68% |
| array | vector_add_scalar | a + scalar | float32 | 262144x1 | 262144x1 | 0.1839 ± 0.0062 | 0.1838 ± 0.0072 | 1.4268 ± 0.0476 | 1.4283 ± 0.0548 | 1.00x ± 0.05x | 0.21% ± 5.11% |
| array | vector_add_scalar | a + scalar | float64 | 262144x1 | 262144x1 | 0.5746 ± 0.0176 | 0.5733 ± 0.0165 | 0.4566 ± 0.0134 | 0.4576 ± 0.0126 | 1.00x ± 0.04x | 0.30% ± 4.11% |
| array | vector_add_vector | a + b | float32 | 262144x1 | 262144x1 | 0.2411 ± 0.0153 | 0.2343 ± 0.0145 | 1.0912 ± 0.0691 | 1.1227 ± 0.0703 | 1.03x ± 0.07x | 3.09% ± 6.68% |
| array | vector_add_vector | a + b | float64 | 262144x1 | 262144x1 | 0.8765 ± 0.0190 | 0.8773 ± 0.0327 | 0.2992 ± 0.0063 | 0.2992 ± 0.0106 | 1.00x ± 0.05x | 0.04% ± 4.65% |
| array | vector_clamp | cwiseMax + cwiseMin | float32 | 262144x1 | 262144x1 | 0.4023 ± 0.0092 | 0.4031 ± 0.0106 | 1.3038 ± 0.0285 | 1.3013 ± 0.0328 | 1.00x ± 0.03x | -0.16% ± 3.15% |
| array | vector_clamp | cwiseMax + cwiseMin | float64 | 262144x1 | 262144x1 | 0.9576 ± 0.0140 | 0.9420 ± 0.0096 | 0.5476 ± 0.0080 | 0.5566 ± 0.0057 | 1.02x ± 0.02x | 1.66% ± 1.52% |
| array | vector_cos | cos(a) | float32 | 262144x1 | 262144x1 | 1.9118 ± 0.0227 | 1.8944 ± 0.0224 | 0.1371 ± 0.0016 | 0.1384 ± 0.0016 | 1.01x ± 0.01x | 0.93% ± 1.28% |
| array | vector_cos | cos(a) | float64 | 262144x1 | 262144x1 | 9.7176 ± 0.0652 | 9.6950 ± 0.0125 | 0.0270 ± 0.0002 | 0.0270 ± 0.0000 | 1.00x ± 0.01x | 0.23% ± 0.67% |
| array | vector_div_scalar | a / scalar | float32 | 262144x1 | 262144x1 | 0.5916 ± 0.0084 | 0.5913 ± 0.0035 | 0.4432 ± 0.0063 | 0.4433 ± 0.0026 | 1.00x ± 0.01x | 0.04% ± 1.16% |
| array | vector_div_scalar | a / scalar | float64 | 262144x1 | 262144x1 | 2.1528 ± 0.0141 | 2.1794 ± 0.0446 | 0.1217 ± 0.0008 | 0.1203 ± 0.0024 | 0.99x ± 0.02x | -1.17% ± 2.47% |
| array | vector_div_vector | a / (b + scalar) | float32 | 262144x1 | 262144x1 | 0.6959 ± 0.0173 | 0.6939 ± 0.0165 | 0.7538 ± 0.0185 | 0.7559 ± 0.0175 | 1.00x ± 0.03x | 0.32% ± 2.56% |
| array | vector_div_vector | a / (b + scalar) | float64 | 262144x1 | 262144x1 | 2.3395 ± 0.0203 | 2.3372 ± 0.0172 | 0.2241 ± 0.0019 | 0.2243 ± 0.0016 | 1.00x ± 0.01x | 0.10% ± 1.34% |
| array | vector_dot | dot() | float32 | 262144x1 | 1x1 | 0.0888 ± 0.0098 | 0.0872 ± 0.0112 | 5.9631 ± 0.6088 | 6.0899 ± 0.6829 | 1.03x ± 0.16x | 3.11% ± 16.47% |
| array | vector_dot | dot() | float64 | 262144x1 | 1x1 | 0.4038 ± 0.0222 | 0.3922 ± 0.0146 | 1.3019 ± 0.0724 | 1.3384 ± 0.0478 | 1.03x ± 0.04x | 2.97% ± 4.46% |
| array | vector_exp | exp(a * scalar) | float32 | 262144x1 | 262144x1 | 1.9252 ± 0.0191 | 1.9539 ± 0.0824 | 0.2724 ± 0.0027 | 0.2687 ± 0.0104 | 0.99x ± 0.03x | -1.35% ± 3.20% |
| array | vector_exp | exp(a * scalar) | float64 | 262144x1 | 262144x1 | 6.2123 ± 0.0463 | 6.1377 ± 0.0068 | 0.0844 ± 0.0006 | 0.0854 ± 0.0001 | 1.01x ± 0.01x | 1.22% ± 0.79% |
| array | vector_fma | a * b + c | float32 | 262144x1 | 262144x1 | 0.4734 ± 0.0156 | 0.4852 ± 0.0254 | 1.1085 ± 0.0364 | 1.0831 ± 0.0564 | 0.98x ± 0.05x | -2.26% ± 4.70% |
| array | vector_fma | a * b + c | float64 | 262144x1 | 262144x1 | 1.2533 ± 0.0297 | 1.2412 ± 0.0196 | 0.4185 ± 0.0099 | 0.4225 ± 0.0065 | 1.01x ± 0.03x | 1.01% ± 3.19% |
| array | vector_log | log(a + scalar) | float32 | 262144x1 | 262144x1 | 1.8750 ± 0.0289 | 1.8875 ± 0.0561 | 0.2797 ± 0.0042 | 0.2780 ± 0.0078 | 0.99x ± 0.01x | -0.62% ± 1.47% |
| array | vector_log | log(a + scalar) | float64 | 262144x1 | 262144x1 | 5.5634 ± 0.0324 | 5.5517 ± 0.0101 | 0.0942 ± 0.0005 | 0.0944 ± 0.0002 | 1.00x ± 0.01x | 0.21% ± 0.64% |
| array | vector_max | max(a, b) | float32 | 262144x1 | 262144x1 | 0.2948 ± 0.0096 | 0.2913 ± 0.0125 | 0.8900 ± 0.0296 | 0.9015 ± 0.0391 | 1.01x ± 0.06x | 1.40% ± 5.62% |
| array | vector_max | max(a, b) | float64 | 262144x1 | 262144x1 | 0.8995 ± 0.0250 | 0.8867 ± 0.0369 | 0.2916 ± 0.0081 | 0.2961 ± 0.0117 | 1.02x ± 0.04x | 1.57% ± 4.16% |
| array | vector_min | min(a, b) | float32 | 262144x1 | 262144x1 | 0.2958 ± 0.0119 | 0.2900 ± 0.0112 | 0.8876 ± 0.0355 | 0.9052 ± 0.0353 | 1.02x ± 0.05x | 2.10% ± 5.13% |
| array | vector_min | min(a, b) | float64 | 262144x1 | 262144x1 | 0.8940 ± 0.0165 | 0.8842 ± 0.0235 | 0.2933 ± 0.0054 | 0.2967 ± 0.0076 | 1.01x ± 0.02x | 1.16% ± 2.47% |
| array | vector_mul_scalar | a * scalar | float32 | 262144x1 | 262144x1 | 0.1970 ± 0.0055 | 0.1955 ± 0.0044 | 1.3317 ± 0.0367 | 1.3414 ± 0.0294 | 1.01x ± 0.04x | 0.80% ± 3.68% |
| array | vector_mul_scalar | a * scalar | float64 | 262144x1 | 262144x1 | 0.5933 ± 0.0114 | 0.6234 ± 0.0583 | 0.4420 ± 0.0085 | 0.4234 ± 0.0347 | 0.96x ± 0.07x | -4.23% ± 7.32% |
| array | vector_mul_vector | a * b | float32 | 262144x1 | 262144x1 | 0.2523 ± 0.0169 | 0.2513 ± 0.0180 | 1.0431 ± 0.0683 | 1.0479 ± 0.0761 | 1.01x ± 0.06x | 0.58% ± 6.05% |
| array | vector_mul_vector | a * b | float64 | 262144x1 | 262144x1 | 0.8744 ± 0.0260 | 0.8814 ± 0.0277 | 0.3000 ± 0.0085 | 0.2977 ± 0.0092 | 0.99x ± 0.04x | -0.71% ± 4.15% |
| array | vector_norm | norm() | float32 | 262144x1 | 1x1 | 0.0766 ± 0.0025 | 0.0759 ± 0.0008 | 6.8540 ± 0.2127 | 6.9066 ± 0.0737 | 1.01x ± 0.03x | 0.88% ± 3.41% |
| array | vector_norm | norm() | float64 | 262144x1 | 1x1 | 0.1679 ± 0.0066 | 0.1707 ± 0.0089 | 3.1263 ± 0.1158 | 3.0791 ± 0.1523 | 0.99x ± 0.07x | -1.32% ± 7.21% |
| array | vector_normalize | normalize() | float32 | 262144x1 | 262144x1 | 0.7610 ± 0.0260 | 0.7496 ± 0.0074 | 1.0345 ± 0.0338 | 1.0492 ± 0.0103 | 1.02x ± 0.04x | 1.53% ± 3.65% |
| array | vector_normalize | normalize() | float64 | 262144x1 | 262144x1 | 2.5184 ± 0.0235 | 2.5160 ± 0.0116 | 0.3123 ± 0.0029 | 0.3126 ± 0.0014 | 1.00x ± 0.01x | 0.10% ± 1.01% |
| array | vector_segment | segment() | float32 | 262144x1 | 131072x1 | 0.0586 ± 0.0026 | 0.0588 ± 0.0030 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.07x | -0.20% ± 6.67% |
| array | vector_segment | segment() | float64 | 262144x1 | 131072x1 | 0.1173 ± 0.0058 | 0.1183 ± 0.0072 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.99x ± 0.07x | -0.54% ± 7.38% |
| array | vector_select | mask.select(a, b) | float32 | 262144x1 | 262144x1 | 0.4471 ± 0.0103 | 0.4443 ± 0.0165 | 0.5865 ± 0.0133 | 0.5908 ± 0.0215 | 1.01x ± 0.05x | 0.78% ± 4.58% |
| array | vector_select | mask.select(a, b) | float64 | 262144x1 | 262144x1 | 1.0560 ± 0.0177 | 1.0460 ± 0.0093 | 0.2483 ± 0.0041 | 0.2506 ± 0.0022 | 1.01x ± 0.02x | 0.96% ± 1.68% |
| array | vector_sin | sin(a) | float32 | 262144x1 | 262144x1 | 1.9014 ± 0.0312 | 1.9291 ± 0.0312 | 0.1379 ± 0.0022 | 0.1359 ± 0.0022 | 0.99x ± 0.01x | -1.43% ± 0.74% |
| array | vector_sin | sin(a) | float64 | 262144x1 | 262144x1 | 9.8594 ± 0.0947 | 9.8342 ± 0.0129 | 0.0266 ± 0.0003 | 0.0267 ± 0.0001 | 1.00x ± 0.01x | 0.26% ± 0.94% |
| array | vector_sqrt | (a + scalar).sqrt() | float32 | 262144x1 | 262144x1 | 0.5683 ± 0.0099 | 0.5801 ± 0.0299 | 0.9228 ± 0.0157 | 0.9057 ± 0.0432 | 0.98x ± 0.05x | -1.83% ± 4.73% |
| array | vector_sqrt | (a + scalar).sqrt() | float64 | 262144x1 | 262144x1 | 2.1125 ± 0.0147 | 2.1021 ± 0.0069 | 0.2482 ± 0.0017 | 0.2494 ± 0.0008 | 1.00x ± 0.01x | 0.50% ± 0.83% |
| array | vector_sub_scalar | a - scalar | float32 | 262144x1 | 262144x1 | 0.1826 ± 0.0062 | 0.1828 ± 0.0076 | 1.4372 ± 0.0472 | 1.4364 ± 0.0567 | 1.00x ± 0.04x | -0.02% ± 3.94% |
| array | vector_sub_scalar | a - scalar | float64 | 262144x1 | 262144x1 | 0.5716 ± 0.0095 | 0.6237 ± 0.1619 | 0.4587 ± 0.0077 | 0.4365 ± 0.0695 | 0.95x ± 0.15x | -4.94% ± 14.69% |
| array | vector_sub_vector | a - b | float32 | 262144x1 | 262144x1 | 0.2433 ± 0.0161 | 0.2384 ± 0.0223 | 1.0818 ± 0.0718 | 1.1080 ± 0.0982 | 1.03x ± 0.09x | 2.63% ± 9.26% |
| array | vector_sub_vector | a - b | float64 | 262144x1 | 262144x1 | 0.8753 ± 0.0231 | 0.8923 ± 0.0464 | 0.2997 ± 0.0077 | 0.2944 ± 0.0146 | 0.98x ± 0.06x | -1.64% ± 6.23% |
| array | vector_sum | sum() | float32 | 262144x1 | 1x1 | 0.0405 ± 0.0006 | 0.0402 ± 0.0001 | 6.4745 ± 0.1026 | 6.5170 ± 0.0213 | 1.01x ± 0.01x | 0.67% ± 1.41% |
| array | vector_sum | sum() | float64 | 262144x1 | 1x1 | 0.0823 ± 0.0038 | 0.0875 ± 0.0116 | 3.1913 ± 0.1329 | 3.0371 ± 0.3500 | 0.95x ± 0.13x | -4.54% ± 12.79% |
| array | vector_tanh | tanh(a * scalar) | float32 | 262144x1 | 262144x1 | 1.1129 ± 0.0115 | 1.1068 ± 0.0162 | 0.4712 ± 0.0048 | 0.4738 ± 0.0068 | 1.01x ± 0.01x | 0.56% ± 1.10% |
| array | vector_tanh | tanh(a * scalar) | float64 | 262144x1 | 262144x1 | 13.9063 ± 0.1157 | 13.8740 ± 0.0113 | 0.0377 ± 0.0003 | 0.0378 ± 0.0000 | 1.00x ± 0.01x | 0.23% ± 0.81% |
| geometry | quaternion_inverse | Quaternion::inverse() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1102 ± 0.0012 | 0.1240 ± 0.0111 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_inverse | Quaternion::inverse() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0798 ± 0.0004 | 0.0816 ± 0.0010 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1261 ± 0.0021 | 0.1372 ± 0.0055 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_normalize | Quaternion::normalize() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.0926 ± 0.0010 | 0.0963 ± 0.0016 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float32 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.3043 ± 0.0025 | 0.3390 ± 0.0056 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | quaternion_to_rotation_matrix | Quaternion::toRotationMatrix() | float64 | 3x1 | 3x3 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.2987 ± 0.0048 | 0.3307 ± 0.0036 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float32 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1232 ± 0.0018 | 0.1422 ± 0.0043 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| geometry | vector_cross | cross() | float64 | 3x1 | 3x1 | 0.0001 ± 0.0000 | 0.0001 ± 0.0000 | 0.1248 ± 0.0019 | 0.1533 ± 0.0148 | 1.00x ± 0.00x | 0.00% ± 0.00% |
| matrix | matrix_add | A + B | float32 | 512x512 | 512x512 | 0.2444 ± 0.0162 | 0.2363 ± 0.0151 | 1.0768 ± 0.0690 | 1.1134 ± 0.0731 | 1.04x ± 0.11x | 3.90% ± 10.64% |
| matrix | matrix_add | A + B | float64 | 512x512 | 512x512 | 0.8806 ± 0.0214 | 0.8841 ± 0.0331 | 0.2979 ± 0.0072 | 0.2969 ± 0.0108 | 1.00x ± 0.04x | -0.30% ± 3.90% |
| matrix | matrix_block | block() | float32 | 512x512 | 256x256 | 0.0307 ± 0.0004 | 0.0306 ± 0.0003 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.01x ± 0.02x | 0.60% ± 2.13% |
| matrix | matrix_block | block() | float64 | 512x512 | 256x256 | 0.0577 ± 0.0003 | 0.0579 ± 0.0010 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.02x | -0.42% ± 1.83% |
| matrix | matrix_colwise_sum | colwise().sum() | float32 | 512x512 | 1x512 | 0.0428 ± 0.0008 | 0.0426 ± 0.0007 | 6.1163 ± 0.1147 | 6.1366 ± 0.0896 | 1.00x ± 0.03x | 0.40% ± 2.56% |
| matrix | matrix_colwise_sum | colwise().sum() | float64 | 512x512 | 1x512 | 0.0878 ± 0.0077 | 0.0848 ± 0.0036 | 2.9994 ± 0.2339 | 3.0920 ± 0.1214 | 1.04x ± 0.09x | 3.65% ± 8.98% |
| matrix | matrix_cwise_product | cwiseProduct | float32 | 512x512 | 512x512 | 0.2589 ± 0.0170 | 0.2466 ± 0.0136 | 1.0166 ± 0.0655 | 1.0661 ± 0.0618 | 1.05x ± 0.09x | 5.23% ± 8.60% |
| matrix | matrix_cwise_product | cwiseProduct | float64 | 512x512 | 512x512 | 0.8840 ± 0.0300 | 0.8962 ± 0.0369 | 0.2968 ± 0.0097 | 0.2929 ± 0.0121 | 0.99x ± 0.03x | -1.29% ± 3.10% |
| matrix | matrix_determinant | determinant() | float32 | 512x512 | 1x1 | 12.1405 ± 1.0030 | 5.2100 ± 0.1221 | 7.4167 ± 0.6275 | 17.1831 ± 0.4104 | 2.33x ± 0.21x | 133.20% ± 20.93% |
| matrix | matrix_determinant | determinant() | float64 | 512x512 | 1x1 | 17.5771 ± 1.1407 | 9.4609 ± 1.0266 | 5.1098 ± 0.3295 | 9.5376 ± 0.8177 | 1.87x ± 0.19x | 87.22% ± 19.18% |
| matrix | matrix_gemv | A * x | float32 | 512x512 | 512x1 | 0.0728 ± 0.0024 | 0.0998 ± 0.0011 | 7.2020 ± 0.2387 | 5.2476 ± 0.0586 | 0.73x ± 0.02x | -27.08% ± 2.31% |
| matrix | matrix_gemv | A * x | float64 | 512x512 | 512x1 | 0.1675 ± 0.0050 | 0.2008 ± 0.0099 | 3.1296 ± 0.0911 | 2.6139 ± 0.1215 | 0.84x ± 0.05x | -16.39% ± 4.98% |
| matrix | matrix_identity | Identity() | float32 | 1x1 | 512x512 | 0.3157 ± 0.0035 | 0.3437 ± 0.0031 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.92x ± 0.01x | -8.14% ± 1.38% |
| matrix | matrix_identity | Identity() | float64 | 1x1 | 512x512 | 0.3610 ± 0.0094 | 0.3946 ± 0.0177 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.92x ± 0.04x | -8.38% ± 4.02% |
| matrix | matrix_inverse | inverse() | float32 | 512x512 | 512x512 | 50.5584 ± 0.9010 | 15.5381 ± 1.3623 | 5.3109 ± 0.0952 | 17.3835 ± 1.3633 | 3.27x ± 0.24x | 227.24% ± 24.16% |
| matrix | matrix_inverse | inverse() | float64 | 512x512 | 512x512 | 85.6748 ± 0.6326 | 25.2014 ± 1.8696 | 3.1333 ± 0.0230 | 10.7039 ± 0.7830 | 3.42x ± 0.26x | 241.66% ± 25.55% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float32 | 512x512 | 512x1 | 0.1301 ± 0.0041 | 0.1256 ± 0.0023 | 4.0339 ± 0.1187 | 4.1760 ± 0.0738 | 1.04x ± 0.05x | 3.64% ± 4.56% |
| matrix | matrix_ldlt_solve | LDLT::solve(x) | float64 | 512x512 | 512x1 | 0.2601 ± 0.0030 | 0.2116 ± 0.0029 | 2.0160 ± 0.0226 | 2.4787 ± 0.0328 | 1.23x ± 0.02x | 22.96% ± 1.98% |
| matrix | matrix_llt_solve | LLT::solve(x) | float32 | 512x512 | 512x1 | 0.1339 ± 0.0007 | 0.1297 ± 0.0010 | 3.9156 ± 0.0201 | 4.0419 ± 0.0303 | 1.03x ± 0.01x | 3.24% ± 1.20% |
| matrix | matrix_llt_solve | LLT::solve(x) | float64 | 512x512 | 512x1 | 0.2642 ± 0.0040 | 0.2143 ± 0.0028 | 1.9848 ± 0.0296 | 2.4463 ± 0.0314 | 1.23x ± 0.03x | 23.29% ± 3.13% |
| matrix | matrix_matmul | A * B | float32 | 512x512 | 512x512 | 3.0865 ± 0.4786 | 1.7980 ± 0.5509 | 88.2614 ± 9.8672 | 158.5934 ± 34.6302 | 1.84x ± 0.55x | 83.85% ± 54.82% |
| matrix | matrix_matmul | A * B | float64 | 512x512 | 512x512 | 6.3781 ± 0.7170 | 3.9874 ± 1.1349 | 42.4325 ± 3.8308 | 70.3070 ± 12.0051 | 1.67x ± 0.35x | 67.29% ± 35.34% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float32 | 512x512 | 512x1 | 0.2161 ± 0.0075 | 0.2155 ± 0.0026 | 1.2117 ± 0.0397 | 1.2145 ± 0.0146 | 1.00x ± 0.04x | 0.34% ± 4.24% |
| matrix | matrix_rowwise_sum | rowwise().sum() | float64 | 512x512 | 512x1 | 0.6470 ± 0.1152 | 0.6061 ± 0.0617 | 0.4141 ± 0.0609 | 0.4350 ± 0.0369 | 1.08x ± 0.22x | 7.55% ± 21.61% |
| matrix | matrix_sub | A - B | float32 | 512x512 | 512x512 | 0.2458 ± 0.0175 | 0.2370 ± 0.0148 | 1.0712 ± 0.0730 | 1.1103 ± 0.0735 | 1.04x ± 0.11x | 4.21% ± 11.15% |
| matrix | matrix_sub | A - B | float64 | 512x512 | 512x512 | 0.8784 ± 0.0195 | 0.8945 ± 0.0402 | 0.2986 ± 0.0065 | 0.2936 ± 0.0130 | 0.98x ± 0.04x | -1.65% ± 4.48% |
| matrix | matrix_trace | trace() | float32 | 512x512 | 1x1 | 0.0008 ± 0.0000 | 0.0007 ± 0.0000 | 0.6784 ± 0.0045 | 0.6900 ± 0.0081 | 1.10x ± 0.07x | 10.00% ± 6.90% |
| matrix | matrix_trace | trace() | float64 | 512x512 | 1x1 | 0.0010 ± 0.0000 | 0.0011 ± 0.0004 | 0.5202 ± 0.0068 | 0.4994 ± 0.0966 | 0.95x ± 0.19x | -4.54% ± 18.59% |
| matrix | matrix_transpose | transpose() | float32 | 512x512 | 512x512 | 1.7316 ± 0.0269 | 1.7152 ± 0.0236 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.01x ± 0.01x | 0.96% ± 1.26% |
| matrix | matrix_transpose | transpose() | float64 | 512x512 | 512x512 | 3.3745 ± 0.2731 | 3.2961 ± 0.1231 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.02x ± 0.08x | 2.41% ± 7.99% |
| matrix | matrix_zero | Zero() | float32 | 1x1 | 512x512 | 0.0841 ± 0.0018 | 0.0838 ± 0.0009 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 1.00x ± 0.03x | 0.41% ± 2.68% |
| matrix | matrix_zero | Zero() | float64 | 1x1 | 512x512 | 0.1706 ± 0.0086 | 0.1716 ± 0.0048 | 0.0000 ± 0.0000 | 0.0000 ± 0.0000 | 0.99x ± 0.05x | -0.56% ± 4.75% |