大数据计算里的加速利器-向量化

文章目录

向量化

通俗来说在列式存储的数据库里来说,如果要对数据进行累加运行,如果每次只能操作一个数,必然效率低下,向量操作就是就是采用SIMD技术,通过一个指令,实现对多个数据的处理

使用场景

通常会用在列式数据库,作分析数据使用。 比如clickhouse

代码说明

通常代码来详细展示使用向量和传统方式实现相加的实现方式

bash 复制代码
#include <iostream>
#include <arm_neon.h>  // 包含 ARM NEON SIMD 指令集的头文件
#include <chrono>      // 用于计时的头文件

void vector_add_neon(const float32_t* a, const float32_t* b, float32_t* result, size_t n) {
    size_t i = 0;
    for (; i + 4 <= n; i += 4) {
        float32x4_t va = vld1q_f32(a + i);    // 加载 4 个浮点数到 NEON 寄存器 va
        float32x4_t vb = vld1q_f32(b + i);    // 加载 4 个浮点数到 NEON 寄存器 vb
        float32x4_t vr = vaddq_f32(va, vb);   // 对寄存器 va 和 vb 中的浮点数逐元素相加
        vst1q_f32(result + i, vr);            // 将结果存储回内存
    }
    for (; i < n; ++i) {
        result[i] = a[i] + b[i];
    }
}

void vector_add_basic(const float* a, const float* b, float* result, size_t n) {
    for (size_t i = 0; i < n; ++i) {
        result[i] = a[i] + b[i];
    }
}

int main() {
    const size_t n = 1000000;  // 数组长度增加到 100 万
    float32_t a[n];
    float32_t b[n];
    float32_t result_neon[n];
    float32_t result_basic[n];

    // 初始化数组 a 和 b
    for (size_t i = 0; i < n; ++i) {
        a[i] = static_cast<float32_t>(i);
        b[i] = static_cast<float32_t>(i * 2);
    }

    // 测量使用 NEON SIMD 的计算时间
    auto start_neon = std::chrono::high_resolution_clock::now();
    vector_add_neon(a, b, result_neon, n);
    auto end_neon = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed_neon = end_neon - start_neon;

    // 测量普通循环计算时间
    auto start_basic = std::chrono::high_resolution_clock::now();
    vector_add_basic(a, b, result_basic, n);
    auto end_basic = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> elapsed_basic = end_basic - start_basic;

    // 输出结果
    std::cout << "NEON SIMD 加速耗时: " << elapsed_neon.count() << " 秒\n";
    std::cout << "普通循环耗时: " << elapsed_basic.count() << " 秒\n";

    return 0;
}
相关推荐
FlightYe10 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
by2099911 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble12 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长12 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall13 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊13 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
你怎么知道我是队长16 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
青少儿编程课堂16 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
雷✘17 小时前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++
努力实干17 小时前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式