本来自己写了一个,不过性能竟然和memcpy一样,一点提升都没有,所以有就去网上找了一个性能好的。

下面的程序是对100MB数据进行内存拷贝.

我测试了一下。

直接调用memcpy时间为100ms左右,而asm中的程序能把时间能缩短到80ms左右。

性能提高的还是很明显的。

#include <iostream>
#include <ctime>
#define  N 100*1024*256using namespace std;int main(int argc, char* argv[])
{float *a;float *b;a=(float*)malloc(N*sizeof(float));b=(float*)malloc(N*sizeof(float));for (unsigned long i=0;i<N;++i){a[i]=rand();}unsigned long n=N*sizeof(float);void *tbuf;tbuf=(void*)malloc(2048);time_t start,end;start=clock();//    memcpy(b,a,N*sizeof(float));
    __asm {mov esi, [a]mov ecx, nmov ebx, ecxshr ebx, 11 // 2048 bytes at a time
            mov edi, [b]loop2k: // Copy 2k into temporary buffer
            push edimov edi, tbufmov ecx, 2048shr ecx, 6loopMemToL1:prefetchnta 64[esi] // Prefetch next loop, non-temporalprefetchnta 96[esi]movq mm1,  0[esi] // Read in source datamovq mm2,  8[esi]movq mm3, 16[esi]movq mm4, 24[esi]movq mm5, 32[esi]movq mm6, 40[esi]movq mm7, 48[esi]movq mm0, 56[esi]movq  0[edi], mm1 // Store into L1movq  8[edi], mm2movq 16[edi], mm3movq 24[edi], mm4movq 32[edi], mm5movq 40[edi], mm6movq 48[edi], mm7movq 56[edi], mm0add esi, 64add edi, 64dec ecxjnz loopMemToL1pop edi // Now copy from L1 to system memory
            push esimov esi, tbufmov ecx, 2048shr ecx, 6loopL1ToMem:movq mm1, 0[esi] // Read in source data from L1movq mm2, 8[esi]movq mm3, 16[esi]movq mm4, 24[esi]movq mm5, 32[esi]movq mm6, 40[esi]movq mm7, 48[esi]movq mm0, 56[esi]movntq 0[edi], mm1 // Non-temporal storesmovntq 8[edi], mm2movntq 16[edi], mm3movntq 24[edi], mm4movntq 32[edi], mm5movntq 40[edi], mm6movntq 48[edi], mm7movntq 56[edi], mm0add esi, 64add edi, 64dec ecxjnz loopL1ToMempop esi // Do next 2k block
            dec ebxjnz loop2kemms;}end=clock();cout<<end-start<<endl;for (unsigned long i=N-10;i<N;i++){cout<<a[i]<<"  "<<b[i]<<endl;}free(a);free(b);free(tbuf);system("pause");return 0;
}

也可以尝试一下xmm寄存器,一次移动128字节也许性能能提高更多。

多媒体指令(内存拷贝加速)相关推荐

  1. 源码分享:C++矩阵类CLMatrixT,功能强大使用简单,支持内存池、宽指令、并行化加速!持续更新...

    CLMatrixT文档目录: C++矩阵类模板CLMatrixT介绍: 特点 新增功能 先演示使用方法: 再看运行测试结果: 最后分享源代码: C++矩阵类模板CLMatrixT介绍: 最近在研究AI ...

  2. Android显存到内存拷贝耗时,memcpy速度太慢?掌握这个技术让内存拷贝效率成倍提升...

    封面出自:板栗懒得很 memcpy是C/C++的一个标准函数,原型void *memcpy(void *dest, const void *src, size_t n),用于从源src所指的内存地址的 ...

  3. C语言常用库函数实现(一)_内存拷贝

    库函数的实现也是面试中的常考题,因为这是最能体现C语言功底的. 一.strcpy与strncpy     先看一下函数的原型:           strcpy函数可以按如下的方式实现: 点击(此处) ...

  4. 安全函数最全总结:字符串拷贝,内存拷贝,字符串格式化等

    对于安全函数和非安全函数有几个方面需要比较: 入参.安全函数会比非安全函数多一个目的缓冲区长度,这个参数一般紧跟着目的缓冲区指针,作为函数的第二个入参. 函数返回值.非安全函数也就是系统函数,比如字符 ...

  5. memcpy()内存拷贝和赋值操作效率测试

    比较memcpy()内存拷贝和"="赋值操作效率,测试代码如下 #include <stdio.h> #include <malloc.h> #includ ...

  6. 多媒体指令(灰度像素最大值)

    如果不是处理的灰度图像,那么最大值也就没什么意思了. 彩色图也可以转成灰度图嘛. 虽然用了汇编,不过没有使用多媒体指令. 灰度图像的RGB都一样,没必要使用mmx寄存器了,直接对单个字节处理就行了. ...

  7. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果

    Android自定义View实现内存清理加速球效果 发布时间:2020-09-21 22:21:57 来源:脚本之家 阅读:105 作者:程序员的自我反思 前言 用过猎豹清理大师或者相类似的安全软件, ...

  8. c语言内存复制函数,【C语言】 字符串操作函数及内存拷贝函数归总

    今天在这里把零散的一些常用的字符串操作函数和内存拷贝函数进行一下归总实现. 一 . 字符串操作函数 字符串操作函数有很多,这里我列举一些常用的函数,以及自实现的代码: 字符串拷贝函数: 函数原型:ch ...

  9. C++11如何减少内存拷贝次数

    C++11中出现了很多迷人的特性.例如智能指针实现高效的内存管理,std::bind和std::function函数封装器,以及lambda实现的函数对象语法糖,都是使我着迷的地方. 而C++11最大 ...

最新文章

  1. jmeter吞吐量图形显示_Jmeter系列(43)- 详解 Jmeter 图形化 HTML 压测报告之 Charts 模块...
  2. CENTOS 7安装步骤apache-tomcat-8.5.34-windows-x86
  3. python中计算带分数_聊聊 python 数据处理全家桶(Redis篇)
  4. Cmake的install与file命令的区别
  5. 燃烧温度计算程序_【知识库】燃气燃烧器如何安全操作?
  6. 程序实现switch语句判断年龄_【回顾】(选择执行语句if else和switch)乐创DIY C语言讲义——3.8节(4)...
  7. 下述有关计算机网络的描述错误的是6,下述有关计算机总线的描述错误的是( ) 。...
  8. [css] css中最常用的字体有哪些?你是怎么选择字体的?
  9. plc的指针和c语言指针,关于STEP7 Pointer指针的问题
  10. 纠结也好,蛋疼也罢,既然创业了,就把路走好。
  11. svm各种工具箱(先放着了,省的找起来麻烦^.^)
  12. 【产品 设计】入门 - 工具篇 - Sketch + Skala Preview
  13. php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
  14. OpenCV--二值化
  15. mac教程:磁力种子qBittorrent 使用教程
  16. 51 ADC0809八路NTC温度采集系统(代码+仿真,OLED SPI)
  17. 用电脑怎么录制游戏视频
  18. 生成pdf设置中文字体出错Identity-H' is not recognized
  19. 网站内部优化-怎么做好网站内部SEO优化-网站内部SEO优化方案
  20. 【折腾服务器 1】妖板 Intel N5105 + i226 主板安装 ESXi 7.0 教程

热门文章

  1. Discuz! Ucenter API for JAVA jar包和测试代码
  2. 面试问题大全(不断添加中)
  3. spring boot 的使用(一)
  4. 查看、关闭SELinux
  5. 我就随便写写,你也随便看看。
  6. Android 虚拟机与真机调试配置
  7. LeetCode 201. 数字范围按位与
  8. 详细描述一下 Elasticsearch 索引文档的过程。
  9. 数据千万条,安全第一条
  10. mysql被除数为0不报错_MySQL:关系除法