在C/C++代码中使用SSE等指令集的指令(5)SSE进行加法运算简单的性能测试

2023-10-31

下面是一个简单的测试SSE指令性能的程序,可以看到明显的性能提升。

(说明:程序中的timing.h使用的是http://blog.csdn.net/gengshenghong/article/details/6973086中介绍的时间间隔获取方法)

 

#define WIN
#include "timing.h"
#include <intrin.h>
#include <stdlib.h>
#include <math.h>

#define N 4*100000		// 注意:必须是4的倍数,否则使用SSE指令计算,要进行一些处理,从而保证正确。
_MM_ALIGN16 float op1[N];
_MM_ALIGN16 float op2[N];
_MM_ALIGN16 float result1[N];
_MM_ALIGN16 float result2[N];

void init()
{
	for(int i = 0;i < N; i++)
	{
		op1[i] = (float)rand()/(float)RAND_MAX;
		op2[i] = (float)rand()/(float)RAND_MAX;
	}
}

void checkResult(int debug)
{
	bool isSame = true;
	for(int i = 0;i < N; i++)
	{
		if (debug)
		{
			printf("%lf		%lf\n", result1[i], result2[i]);
		}
		else
		{
			if (fabs(result1[i] - result2[i]) > 0.000001)
			{
				isSame = false;
				break;
			}
		}
	}
	if (!debug) {
		if (isSame)
			printf("Result is Same\n");
		else
			printf("Result is not same\n");
	}
}

void add1()
{
	for(int i = 0; i < N;i++)
		result1[i] = op1[i] + op2[i];
}

void add2()
{
	__m128  a;
	__m128  b;
	__m128  c;

	for(int i = 0; i < N;i = i + 4)
	{
		// Load
		a = _mm_load_ps(op1 + i);
		b = _mm_load_ps(op2 + i);

		c = _mm_add_ps(a, b);	// c = a + b

		_mm_store_ps(result2 + i, c);
	}
}

int main(int argc, char* argv[])
{
	init();
	srand((unsigned int)time(NULL));

	printf("Add a vector:\n");
	startTiming();
	add1();
	stopWithPrintTiming();

	printf("\n");
	printf("Add a vector with SSE instructions:\n");
	startTiming();
	add2();
	stopWithPrintTiming();

	printf("\n");
	checkResult(0);

	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在C/C++代码中使用SSE等指令集的指令(5)SSE进行加法运算简单的性能测试 的相关文章

  • 编辑器mavon-editor离线使用

    cnd部分 可与运维人员商量一起配置 vue2的使用 1 1在public文件夹下面 放入编辑器的全部文件 1 2引入 1 2 1script下面引入 import Vue from vue import mavonEditor from
  • C# 基础知识 (五).变量类型和字符串处理

    这篇文章是阅读 C 入门经典 Beginning C 书籍里面的内容 作者Karli Watson 主要包括自己缺乏的一些C 基础知识和在线笔记使用 文章主要包括C 简单变量类型和复杂变量类型 命名规则 隐式转换和显示转换 变量字符串处理等
  • CNN卷积神经网络

    CNN卷积神经网络 前言 一 相关概念 卷积 彩色图像卷积 池化 padding Dropout正则化 局部归一化 二 经典网络 AlexNet VGGNet介绍 GoogLeNet ResNet介绍 resnet解决方案 结果 三 实操一
  • 【卷积神经网络】12、激活函数

    文章目录 一 Tanh 二 Sigmoid 三 ReLU 四 Leaky ReLU 五 ELU 六 SiLU 七 Mish 本文主要介绍卷积神经网络中常用的激活函数及其各自的优缺点 最简单的激活函数被称为线性激活 其中没有应用任何转换 一个
  • 数学建模——阅读论文的重要性

    1 我们来交流下怎么拿奖吧 数学建模竞赛虽然它的初衷是非常好的 需要体现一个人应用数学的能力以及创兴能力 但是实际上 经过我多年的比赛 发现其实绝大多数获奖 包括国家一等奖 也是可以通过一定的学习以及一定的技巧来获取的 对于数学建模新手来说
  • python socket传输大文件的方法

    方法一 发送端 1 计算发送文件大小 然后结合文件的其他信息 组成文件头先发送一次 2 发送文件数据时用sendall 一次发送所有数据 好像是重复调用了send 接收端 1 接收端根据接受文件的大小和recv size计算要接收数据的次数
  • 期货开户收费政策非常合理

    需要大家支付的费用由两部分组成 一部分是保证金 另一部分是费率 保证金和费率都由交易所收取 收取的费用是固定的 因为后期大家投资的项目是不一样的 所以需要大家准备的费用肯定也不一样 除了交易所所收取的费用以外 还包括了开户公司所收取的费用
  • Midjourney 使用总结

    1 关键词提问 中国古典女性 东方美女极致面容站在运河码头遥望丈夫 史诗奇幻场景风格 深绿浅棕 细节风帆 柔焦 人像隐喻 4K 电影级高品质照片 全景图 焦距 110mm 光圈 f3 5 画面比例16 9 全景构图 这个可以把图变成二次元
  • 恢复谷歌翻译的究极方法

    谷歌翻译为什么会失效 我想各位在去年11月的时候就知道了 可是要怎么解决失效的问题呢 之前我们是通过手动Ping可以连接的ip 各位可能觉得麻烦 心里觉得什么档次还要我手动ping就没有可以自动扫描的吗 还别说真的有我最近发现一个谷歌翻译修
  • StreamingAsset文件夹

    Unity中的大部分资源在发布时都被整合到工程中 我们不能访问 但有时我们需要通过路径名访问放在目标设备中的文件 这些文件被存储在目标设备的文件系统中 在Unity工程中 放在StreamingAssets文件夹中的任何资源都将被原样复制到
  • 使用Docker安装Elasticsearch和大数据

    在本教程中 我们将探索如何使用Docker容器化技术安装和配置Elasticsearch ES 和大数据处理工具 Elasticsearch是一个强大的开源搜索和分析引擎 而大数据处理工具则提供了对大规模数据集的处理和分析能力 通过将它们与
  • 2023-5-31第三十一天

    conform顺从 遵从 一致 squeeze挤压 proprietary专卖权 专利的 所有的 endeavor努力 尽力 comprise由 组成 包含 compose组成 写作 compact小型的 consult咨询 查阅 expa
  • Linux CentOS 7 安装mongoDB

    安装之前准备工作 环境说明 1系统虚拟机信息 CentOS7 X86 64位 2软件及版本 mongodb linux x86 64 3 6 3 tgz Xshell工具 MongoDB 提供了 linux 各发行版本 64 位的安装包 你
  • string容器

    string容器 构造和析构 string容器的设计目标 strinf容器的操作 构造和析构 void testOne cout lt lt 显示string中字符数组的最大长度 lt lt endl cout lt lt string n
  • AOP(Aspect-oriented programming,面向切面编程)

    概述 面向切面的程序设计 Aspect oriented programming AOP 是CS计算机科学中的一种程序设计泛型 旨在将横切关注点与业务主体进行进一步分离 以提高程序代码的模块化程度 其可以通过预编译方式和运行期动态代理实现在
  • VSCODE的安装与配置Anaconda环境

    1 下载安装包安装 推荐 最新版本的Anaconda没有VSCODE因此可以直接百度VSCODE进行安装 a VSCODE的下载 直接加载VSCODE的官网https code visualstudio com 点击Download for
  • Shell脚本中引用另一个脚本文件

    在Shell中要调用别的shell脚本或别的脚本中的变量有一下两种方式 方法一 使用点号 subscript sh 方法二 使用source source subscript sh 注意 1 两个点之间 有空格 2 两个脚本不在同一目录 要

随机推荐

  • 用GLM来读取显示有纹理的OBJ

    注意这里的GLM不是OPENGL MATHAMATICS LIBRAR 而是an Alias Wavefront OBJ file library 用来操作OBJ文件的一个库 这里用其来读取带纹理的OBJ文件并显示出来 1 下载GLM库 h
  • 括号生成(结合Catalan数详细分析)

    题目 给出n代表生成括号的对数 请你写出一个函数 使其能够生成所有可能的并且有效的括号组合 例如 给出n 3 生成结果为 PS 本题源自 leetcode 22 理论基础 Catalan数 卡特兰数 Catalan数列是序列 C 0
  • Win10 下 ProtoBuf 安装编译以及在 C++ 中的用法

    ProtoBuf Protocol Buffer protoBuf 或 PB 是 google 的一种数据交换的格式 它独立于语言 独立于平台 google 提供了多种语言的实现 java c c go 和 python 每一种实现都包含了
  • CSS 层叠顺序

    参考文章 一篇通俗易懂的 CSS 层叠顺序与上下文 http mp weixin qq com s biz MzAxODE2MjM1MA mid 2651551373 idx 2 sn f4308981b08c1e347ed021a5afc
  • 【单片机基础】(一)从硬件的角度解读与门、或门、非门、与非门

    1 高电平和低电平 数字电路中 由TTL电子元器件组成电路使用的电平 电平是个电压范围 规定输出高电平 gt 2 4V 输出低电平 lt 0 4V 在室温下 一般输出高电平是3 5V 输出低电平是0 2V 最小输入高电平和低电平 输入高电平
  • 解决: Gitee 自已提交的代码提交人头像为他人、码云上独自开发的项目显示为 2 个开发者

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 1 我的情况 项目一直只有我一个开发者 却莫名的出来了一个完全不认识的开发者 我新建后 push 的所有项目都变成了开发者有 2 个人 多出一
  • TensorFlow学习笔记02:使用tf.data读取和保存数据文件

    TensorFlow学习笔记02 使用tf data读取和保存数据文件 使用 tf data 读取和写入数据文件 读取和写入csv文件 写入csv文件 读取csv文件 读取和保存TFRecord文件 TFRecord基础API Exampl
  • Google Protocol Buffer

    hadoop的writable模式持久化接口 什么是 Google Protocol Buffer 假如您在网上搜索 应该会得到类似这样的文字介绍 Google Protocol Buffer 简称 Protobuf 是 Google 公司
  • Qt中常用宏定义

    1 Q UNUSED variable 定义但没有使用的变量在编译的时候有Warning提示 使用Q UNUSED variable 后可以屏蔽这类警告 2 Q ASSERT boolvalue 在Debug模式下 如果输入值为true 什
  • 敏感词过滤-DFA算法

    目录 DFA算法简介 Java实现DFA算法实现敏感词过滤 测试方法 创建DFAMap 根据DFAMap进行检验 完整代码 与前缀树的类似与不同 类似 不同 复杂度 DFA算法简介 在实现文字过滤的算法中 DFA是唯一比较好的实现算法 DF
  • Java Swing图书管理系统,界面漂亮、功能全,直接使用 窗体版本-400

    今天为大家分享一个java语言编写的图书管理程序 400 目前系统功能已经很全面 后续会进一步完善 整个系统界面漂亮 有完整得源码 希望大家可以喜欢 喜欢的帮忙点赞和关注 一起编程 一起进步 开发环境 开发语言为Java 开发环境Eclip
  • Qt中报错error: allocation of incomplete type ‘Ui::MainXXXX‘

    Qt中报错error allocation of incomplete type Ui MainXXXX 可能原因 一 类关联问题 是你的类设计头文件源文件和ui文件的关联可能有问题 解决方案如下 原文链接 每次在Qt中单独添加UI文件的时
  • Android SharedPreferences的替代方案MMKV

    什么是MMKV MMKV 是基于 mmap 内存映射的移动端通用 key value 组件 底层序列化 反序列化使用 protobuf 实现 性能高 稳定性强 https github com Tencent MMKV 为什么要替代Shar
  • 网络攻防学习(Web基础篇)——小迪安全

    一 一些常见的基本概念 1 DNS 1 域名解析系统 2 与HOST的关系 先在本地查找HOST文件 找不到在在网上查找相同的DNS 2 CDN 1 内容分发网络 目的是让用户能够更快的得到请求的数据 简单来说就是用来加速的 他是一个就近访
  • 线程是如何通讯的?

    线程通讯指的是多个线程之间通过共享内存或消息传递等方式来协调和同步它们的执行 在多线程编程中 通常会出现多个线程需要共同完成某个任务的情况 这时就需要线程之间进行通讯 以保证任务能够顺利地执行 线程通讯的实现方式主要有以下两种 共享内存 多
  • substring从指定字符串开始截取

    String filename F workspace ssh photo WebContent uploadFile 1444783552338pic jpg int begin filename indexOf ssh photo in
  • CCF计算机软件能力认证历年真题+超详细解析(C语言)

    这个历年试题解主要使用C语言编写 针对较为简单的第一题和第二题 适合初学者 程序中基本附有注释 希望可以帮到大家 会持续进行补充 欢迎评论区给出更好的解法与思路 2021 12 第 24次 202112 1序列查询 202112 2序列查询
  • 两个集合相等的例题_集合间的基本关系,你懂了吗?

    集合间的基本关系 在集合间的基本关系这一部分 首先要了解什么是子集 什么是真子集什么是集合相等 什么是空集 子集 一般的对于两个集合AB如果集合A中任意一个元素都是集合B中的元素 我们就说这两个集合有包含关系 称集合A为集合B的子集 记作A
  • 运算符

    运算符包括赋值运算符 算术运算符 逻辑运算符 位逻辑运算符 位移运算符 关系运算符 自增自减运算符 大多数运算符都是二目运算符 即运算符位于两个表达式之间 单目运算符的意思是运算符作用于单个表达式 一 赋值运算符 赋值语句的作用是把某个常量
  • 在C/C++代码中使用SSE等指令集的指令(5)SSE进行加法运算简单的性能测试

    下面是一个简单的测试SSE指令性能的程序 可以看到明显的性能提升 说明 程序中的timing h使用的是http blog csdn net gengshenghong article details 6973086中介绍的时间间隔获取方法