使用avx2 指令集加速向量算法运算

使用cpu-z 查看cpu指令集

在这里插入图片描述

2 向量加,乘法,除法

我们使用向量加,为什么函数是0 到 8 的计算,因为avx2 寄存器为256位,同时设置启动增强指令集
在这里插入图片描述

#include <immintrin.h> // 引入包含AVX2指令集的头文件

void vector_addition_avx2(float* __restrict a, float* __restrict b, float* __restrict result, size_t size)
{
    // 检查size是否为2的倍数,确保可以正确处理AVX2的256位寄存器
    assert(size % 8 == 0);

    __m256 va, vb, vr;
    for (size_t i = 0; i < size; i += 8)
    {
        // 加载8个浮点数到AVX寄存器
        va = _mm256_load_ps(a + i);
        vb = _mm256_load_ps(b + i);

        // 使用AVX2指令进行向量加法
        vr = _mm256_add_ps(va, vb);

        // 存储结果回内存
        _mm256_store_ps(result + i, vr);
    }
}

// 主函数或者其他地方调用该函数
int main()
{
    float a[32], b[32], result[32];
    // 初始化a、b数组...
    
    vector_addition_avx2(a, b, result, sizeof(a) / sizeof(a[0]));

    return 0;
}

猜猜以上代码会怎么样,如果是在debug下,明显avx2 指令集会快,在release下,普通代码立刻甩开了avx2指令,所以一定要判断数据量,下面重写代码来测试

如何做

应该在数据量大的情况下使用avx2 指令,否则效果适得其反,没有达到数据的瓶颈,不会显现出好的结果,并且下面我们同时使用向量加,乘法,除法,同时增加一个我以前写过的时间计算类


#include <immintrin.h> // 引入包含AVX2指令集的头文件
#include <chrono>
class TicToc
{
public:
    TicToc()
    {
        tic();
    }

    void tic()
    {
        start = std::chrono::system_clock::now();
    }

    double toc()
    {
        end = std::chrono::system_clock::now();
        std::chrono::duration<double> elapsed_seconds = end - start;
        return elapsed_seconds.count() * 1000;
    }

private:
    std::chrono::time_point<std::chrono::system_clock> start, end;
};

void vector_addition_avx2(float* __restrict a, float* __restrict b, float* __restrict result, size_t size)
{
    // 检查size是否为2的倍数,确保可以正确处理AVX2的256位寄存器
   // assert(size % 8 == 0);

    __m256 va, vb, vr;
    for (size_t i = 0; i < size; i += 8)
    {
        // 加载8个浮点数到AVX寄存器
        va = _mm256_load_ps(a + i);
        vb = _mm256_load_ps(b + i);

        // 使用AVX2指令进行向量加法
        vr = _mm256_add_ps(va, vb);
        vr = _mm256_mul_ps(va, vb);
        vr = _mm256_div_ps(va, vb);
        // 存储结果回内存
        _mm256_store_ps(result + i, vr);
    }
}
void addition(float* a, float* b, float* result, size_t size)
{
    for (int i = 0; i < size; i++)
    {
        result[i] = a[i] + b[i];
        result[i] = a[i] * b[i];
        result[i] = a[i] / b[i];
    }
}
// 主函数或者其他地方调用该函数
int main()
{
#define N 1024
    //float a[NUM], b[NUM], result[NUM],result1[NUM];
    float* a = new float[N * N];
    float* b = new float[N * N];
    float* c = new float[N * N];
    // 初始化a、b数组...
    for (int i = 0; i < N*N; i++)
    {
        a[i] = float(i) * 0.1f;
        b[i] = float(i) * 0.2f;
    }

   


    TicToc t;
    for(int i =0;i<1000;i++)
        vector_addition_avx2(a, b, c,N*N);
    printf("time is %f\n",t.toc());



    TicToc t1;
    for (int i = 0; i < 1000; i++)
    {
        addition(a, b, c, N * N);
    }
    printf("time is %f\n", t1.toc());


    for (int i = 0; i < 8; i++)
    {
        printf("%04f ", c[i]);
        printf("%04f \n",c[i]);
    }
    delete[]a;
    delete[]b;
    delete[]c;
    return 0;
}

3 结果显示

在1M数据向量的运算量下,结果显示,普通计算要比avx2指令集慢了好几倍,优点显现
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/548355.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024认证杯数学建模A题保暖纤维保暖能力原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了认证杯数学中国数学建模网络挑战赛第一阶段A题目保暖纤维的保暖能力完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品…

【Conda基础命令】使用conda创建、查看、删除虚拟环境及可能的报错处理

文章目录 前言&#xff08;1&#xff09; 在默认路径下创建一个新的虚拟环境&#xff08;2&#xff09; 查看已有的虚拟环境&#xff08;3&#xff09; 删除已有的虚拟环境&#xff08;谨慎操作&#xff09;&#xff08;4&#xff09;激活虚拟环境&#xff08;5&#xff09;退出…

社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)

社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;服务种类管理 &#xff08;3&#xff09;社区服务管理 &#xff08…

STM32F103ZE-中断

文章目录 122.12.22.32.42.52.62.6.12.6.2 33.13.23.34.14.3 56788.18.2 NVIC 管理所有中断EXTI 外部中断事件控制器 针对外部 可以看成NVIC 下属 1 中断和 中止&#xff08;不回去了&#xff09;不一样 搁一段时间就如果不用中断 用while&#xff08;&#xff09; 可能夹半天…

中伟视界:智慧矿山智能化预警平台功能详解

矿山智能预警平台是一种高度集成化的安全监控系统&#xff0c;它能够提供实时的监控和报警功能&#xff0c;帮助企业和机构有效预防和响应潜在的安全威胁。以下是矿山智能预警平台的一些关键特性介绍&#xff1a; 报警短视频生成&#xff1a; 平台能够在检测到报警时自动生成短…

记录一次内存溢出

1、查看catalina相关日志&#xff0c;确定关键字相关行号 文件&#xff1a;catalina.out命令1&#xff1a;cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上&#xff0c;每一个行号其实都对应到具体时间点。可以发现&#xff0c;这个范围相符合&#xff1…

Harbor安装手册

安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i -e /mirrors.cloud.aliyuncs.com/d -e /mirrors.aliyuncs.com/d \ /etc/yum.repos.d/…

【御控物联】Java JSON结构转换(3):对象To对象——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON对象 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

Centos Steam 8安装MariaDB报错

1&#xff1a;按照MariaDB的官网配置安装文件. 2 &#xff1a;使用安装命令安装出现下面错误。说“所有的匹配结果均已经被参数的模块化过滤条件除” 3&#xff1a;这个只需要禁用系统的安装模块即可。 yum module disable mariadb 4&#xff1a;再次安装就不会报错了。

C语言——内存函数的实现和模拟实现

1. memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 这个函数在遇到 \0 的时候并不会停下来。 如果source和destination有任何的重叠&am…

2024“点点点”测试员如何上岸测试开发岗?附完整学习路线!

有很多人员会不断问自己&#xff0c;自己到底要不要学测试&#xff0c;或者要不要坚持做测试&#xff0c;测试的职业发展到底怎么样&#xff1f;如果你还在迷茫&#xff0c;在到处找各种大牛问类似的问题&#xff0c;我希望这篇文章&#xff0c;你看完能够结束你的这个烦恼&…

bugku-web-点login咋没反应

在页面源码中看到一个css文件 并看到构建的表是post请求 访问后看到一个注释&#xff0c;叫尝试?17026 在页面尝试 得到源码 这里让在cookie中添加参数BUGKU&#xff0c;并使参数为字符串类型ctf.bugku.com 这里有反序列化函数&#xff0c;先得到字符串ctf.bugku.com的序列号…

深度学习知识点:卷积神经网络(CNN)

深度学习知识点&#xff1a;卷积神经网络&#xff08;CNN&#xff09; 前言卷积神经网络&#xff08;CNN&#xff09;卷积神经网络的结构Keras搭建CNN经典网络分类LeNetAlexNetAlexNet 对比LeNet 的优势&#xff1f; VGGVGG使用2个33卷积的优势在哪里&#xff1f;每层卷积是否只…

Java开发从入门到精通(九):Java的面向对象OOP:成员变量,局部变量,实体类的案例

Java大数据开发和安全开发 &#xff08;一)Java的变量1.1 成员变量和局部变量的区别1.2 成员变量1.3 局部变量1.4 实体类的案例 &#xff08;一)Java的变量 1.1 成员变量和局部变量的区别 1、类中位置不同:成员变量(类中&#xff0c;方法外)、局部变量(常见于方法中)2、初始化…

多模态AnyGPT——整合图像、语音和文本多模态大规模语言模型算法原理与实践

概述 大规模语言模型在理解和生成人类语言方面具有非凡的能力&#xff0c;但迄今为止&#xff0c;它们的能力主要局限于文本处理。然而&#xff0c;现实世界是一个多模式的环境&#xff0c;信息通过视觉、听觉和触觉等多种感官进行交换。融入这种多样性是开发下一代系统的主要…

高效求解最长回文子序列:动态规划方法与C语言实现

高效求解最长回文子序列&#xff1a;动态规划方法与C语言实现 问题描述解决方案伪代码C代码示例算法分析进一步讨论 在计算机科学中&#xff0c;回文是一种有趣的字符串&#xff0c;它在正序和逆序下是相同的。例如&#xff0c;“civic”、"racecar"和"aibohpho…

解决Qt中文乱码

解决Qt中文乱码 编程环境解决方法设置编辑器的文件编码每个源文件中增加设置增加转码代码有中文的源文件添加UTF-8 BOM 编程环境 WindowsQCreatorQtMSVC 解决方法 设置编辑器的文件编码 项目->Project Settings->编辑器->文件编码&#xff1a; 1.设置默认编码为&a…

吴恩达机器学习:均值聚类法(K-means Clustering)

在本练习中&#xff0c;您将实现K-means算法并将其用于图像压缩。 您将从一个样本数据集开始&#xff0c;该数据集将帮助您直观地了解K-means算法的工作原理。之后&#xff0c;您将使用K-means算法进行图像压缩&#xff0c;将图像中出现的颜色数量减少到该图像中最常见的颜色。…

树--排序二叉树的删除

一、二叉排序树的删除 二叉排序树的删除情况比较复杂&#xff0c;有以下三种情况需要考虑。 删除叶子节点 &#xff08;比如&#xff1a;2,5,9,10&#xff09;删除只有一个子树的节点&#xff08;比如&#xff1a;1&#xff09;删除有两个子树的节点 &#xff08;比如&#x…

【测试思考】当我给互联网姐妹解读电商大促规则

20年初&#xff0c;疫情开始&#xff0c;我和同事好不容易回家过年了&#xff0c;但是无法返沪&#xff0c;只能远程上班。 远程上班的效率比我想象的高很多&#xff0c;上班时间也比我想象的拉长很多&#xff0c;抛开这些扯远了&#xff0c;我们当时在做一个优惠券的项目。 下…
最新文章