SIMD初入门——第一个SIMD程序运行

本文详细指导了如何在C++中利用SIMD技术,通过GCC和MINGW环境配置,实现AVX向量化操作,提供了vectorAdd函数实例。
摘要由CSDN通过智能技术生成

首先要了解什么是SIMD,官方一点就是用向量化指令加速程序运行,通俗一点就是说**,用一个框架去写代码,这个代码的运算速度和空间使用都很棒**。
网上对于原理的介绍有很多,我这里主要偏实战。
想要执行SIMD,首先要配置好GCC的环境,MINGW即可,然后编写代码,使用带参数的命令执行即可(AVX框架)。

第一次使用的情况下,直接使用AVX框架(MINGW里面自带的)

代码

#include <iostream>
#include <immintrin.h>

void vectorAdd(float* a, float* b, float* result, int size) {
    const int vectorSize = 8; // 使用 AVX 指令集,每次处理 8 个 float 元素

    // 向量化循环
    for (int i = 0; i < size; i += vectorSize) {
        // 加载向量
        __m256 vec_a = _mm256_loadu_ps(a + i);
        __m256 vec_b = _mm256_loadu_ps(b + i);

        // 向量加法
        __m256 vec_result = _mm256_add_ps(vec_a, vec_b);

        // 存储结果
        _mm256_storeu_ps(result + i, vec_result);
    }
}

int main() {
    const int size = 16;
    float a[size] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f};
    float b[size] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f};
    float result[size];

    vectorAdd(a, b, result, size);

    // 打印结果
    for (int i = 0; i < size; ++i) {
        std::cout << result[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

文件命名为test.cpp

编译命令

g++ -o test test.cpp -mavx

执行命令

.\test

即可看到结果,到这里,恭喜你进入了SIMD的世界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值