当前位置:网站首页>申请内存,std::transform和AVX256指令集用例和执行速度比较
申请内存,std::transform和AVX256指令集用例和执行速度比较
2022-07-30 06:00:00 【ZHY.Spiritual】
用两个一维数组交叉想减为例:
long long *pDataStop1 = new long long[iSize1];
long long *pDataStop2 = new long long[iSize2];1.申请内存指针用操作,数据的画,自己导入模拟数据
int m_iMaxDiff;
QMap<long long, int> m_mStatisTau;
int iSize1 = 7000;
int iSize2 = 7000;
long long *pDataStop1 = new long long[iSize1];
long long *pDataStop2 = new long long[iSize2];
long long iStop2;
long long iValue;
for(int j = 0; j < iSize1; j += 4) {
for(int k = 0; k < iSize2; k++) {
iStop2 = pDataStop2[k];
iValue = pDataStop1[j] - iStop2;
if(std::abs(iValue) <= m_iMaxDiff) {
m_mStatisTau[iValue] += 1;
}
iValue = pDataStop1[j + 1] - iStop2;
if(std::abs(iValue) <= m_iMaxDiff) {
m_mStatisTau[iValue] += 1;
}
iValue = pDataStop1[j + 2] - iStop2;
if(std::abs(iValue) <= m_iMaxDiff) {
m_mStatisTau[iValue] += 1;
}
iValue = pDataStop1[j + 3] - iStop2;
if(std::abs(iValue) <= m_iMaxDiff) {
m_mStatisTau[iValue] += 1;
}
}
}这个执行完,大概需要310ms
2.std::transform,内部用的多线程,c++17才能使用,使用std::execution::par_unseq项是最快的
for(int i = 0; i < iSize; i++) {
int iSize1 = vDataStop2[i].size();
std::vector<long long> vOut(iSize1);
for(int j = 0; j < vDataStop1[i].size(); j++) {
QVector<long long> vStop1(iSize1);
std::fill(vStop1.begin(), vStop1.end(), vDataStop1[i][j]);
std::transform(std::execution::par_unseq, vDataStop2[i].begin(),
vDataStop2[i].end(), vStop1.begin(), vOut.begin(), CalculatePoor);
}
}这个使用vector大概是490ms,使用指针大概是410ms,可以参考我上一个博客,写的比较详细
3.AVX256指令集
__m256i m1, m2;
long long re[4];
for(int j = 0; j < iSize1; j += 4) {
m1 = _mm256_set_epi64x(pDataStop1[j],pDataStop1[j+1],pDataStop1[j+2], pDataStop1[j+3]);
for(int k = 0; k < iSize2; k++) {
m2 = _mm256_set_epi64x(pDataStop2[k], pDataStop2[k], pDataStop2[k], pDataStop2[k]);
__m256i l1 = _mm256_sub_epi64(m1, m2);
re[3] = l1.m256i_i64[0];
re[2] = l1.m256i_i64[1];
re[1] = l1.m256i_i64[2];
re[0] = l1.m256i_i64[3];
if(std::abs(re[3]) <= m_iMaxDiff) {
m_mStatisTau[re[3]] += 1;
}
if(std::abs(re[2]) <= m_iMaxDiff) {
m_mStatisTau[re[2]] += 1;
}
if(std::abs(re[1]) <= m_iMaxDiff) {
m_mStatisTau[re[1]] += 1;
}
if(std::abs(re[0]) <= m_iMaxDiff) {
m_mStatisTau[re[0]] += 1;
}
}
}这个执行时间大概320ms
边栏推荐
- this and super
- Vue项目通过node连接MySQL数据库并实现增删改查操作
- 专访蚂蚁:这群技术排头兵,如何做好底层开发这件事?| 卓越技术团队访谈录
- 如何实时计算日累计逐单资金流
- 进制转换。。。
- 2020年度总结——品曾经,明得失,展未来
- 分布式系统中的开创者—莱斯利·兰伯特
- Electron之初出茅庐——搭建环境并运行第一个程序
- Headline 2: there are several kinds of common SQL errors in MySQL usage?
- Ali two sides: List several tips for Api interface optimization
猜你喜欢

【MySQL】MySQL中如何实现分页操作

The first artificial intelligence safety competition officially launched

C# 使用RestSharp 实现Get,Post 请求(2)
![[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及](/img/ac/80ab67505f7df52d92a206bc3dd50e.png)
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及

人工肌肉智能材料新突破

AI can identify race from X-rays, but no one knows why

从追赶到超越,国产软件大显身手

Huawei released "ten inventions", including computing, intelligent driving and other new fields

ETL为什么经常变成ELT甚至LET?

redis实现分布式锁的原理
随机推荐
uniapp中canvas与v-if更“配”
预测人们对你的第一印象,“AI颜狗”的诞生
VR机器人教你如何正确打乒乓球
适合程序员的输入法
Ali two sides: Sentinel vs Hystrix comparison, how to choose?
selenium模块
golang: Gorm configures Mysql multiple data sources
解决datagrip连接sqlserver报错:[08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。
Pioneer in Distributed Systems - Leslie Lambert
How to understand plucker coordinates (geometric understanding)
【雷达目标检测】恒定阈值法和恒虚警(CFAR)法及代码实现
Electron日常学习笔记
不会吧,Log4j 漏洞还没有完全修复?
Ali: How many methods are there for multi-threaded sequential operation?
go : 使用gorm修改数据
assert
go : create database records using gorm
Hex conversion...
go : go-redis 基础操作
人工肌肉智能材料新突破