快速初始化内存(2)

原创 2004年05月24日 13:27:00

因为我们使用静态库链接,Intel版本在代码中是一个函数调用。跟踪进入,可以发现Intel的实现在第一次调用时会先检测CPU类型,然后根据CPU类型跳转到不同的实现。在P4 机器上,其主循环如下:

 

00401A40   sub         ecx,80h

00401A46   movdqa      xmmword ptr [edx],xmm0

00401A4A   movdqa      xmmword ptr [edx+10h],xmm0

00401A4F   movdqa      xmmword ptr [edx+20h],xmm0

00401A54   movdqa      xmmword ptr [edx+30h],xmm0

00401A59   movdqa      xmmword ptr [edx+40h],xmm0

00401A5E   movdqa      xmmword ptr [edx+50h],xmm0

00401A63   movdqa      xmmword ptr [edx+60h],xmm0

00401A68   movdqa      xmmword ptr [edx+70h],xmm0

00401A6D   add         edx,80h

00401A73   cmp         ecx,80h

00401A79   jge         ___intel_new_memset+750h (00401a40)

 

可见Intel的实现使用了SSE2128xmm寄存器,并且为了促使指令并行,放置了8条复制指令,这样每个循环能够复制128×8=512 Bit

MSC版本:

42:       for (j=0; j< LoopTimes; j++)

43:       {

44:           memset(lpByte,1,SIZE);

0040103B   mov         ecx,1900000h

00401040   mov         eax,1010101h

00401045   mov         edi,ebx

00401047   dec         edx

00401048   rep stos    dword ptr [edi]

0040104A   jne         threadfunc+3Bh (0040103b)

 

如果是Debug版本,因为微软提供了CRTsourcecode,可以跟踪其汇编实现,在Release版本,优化结果为把函数调用展开,但因为这里的实现只使用了普通的386指令按DWORD传送数据,所以在性能上会有如此大的差异。

 

另外,如果测试代码中的SIZE定义为较小的值,比如1024*128,在L2 cache512KP4上,两种方法的执行结果相差不大,由此可见Cache对局部访问的促进作用。

 

说明:以上例子在VC6VC7中的结果相同。如果直接用Intel编译器编译,直接使用memset即可,Intel编译器在遇到memset时实际上编译为__VEC_memset,然后链接到IntelRuntime库上。

VC6项目文件

数据在内存中的存储方式

一、数据概述 以C语言为例,里面所有的基本数据类型,都是以符合人类世界和自然世界的逻辑而出现的。比如说int,bool,float等等。这些数据类型出现的目的,是更于让人容易理解,可以说,这些数...
  • huangchun96
  • huangchun96
  • 2017年05月09日 21:37
  • 531

"0x00a1bdb3" 指令引用的 "0x00000001" 内存。该内存不能为 "read"。

笔记本换成XP系统后,单击我的电脑或者别的时候,有时会提示,下面的错误提示: --------------------------- IExplore.exe - 应用程序错误 ----------...
  • xunzaosiyecao
  • xunzaosiyecao
  • 2014年05月19日 21:57
  • 1941

C语言内存的初始化

我们编写C语言的时候需要给变量申请一块内存区域,当我们创建一个内存区域的时候,内存中的数据十有八九是乱七八糟的(因为其他代码用过后遗留的数据并没有及时清掉) 例如: int main() { ...
  • baidu_34919559
  • baidu_34919559
  • 2016年05月08日 02:17
  • 1177

内存初始化(上)

http://www.wowotech.net/memory_management/mm-init-1.html 一、前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每...
  • zdy0_2004
  • zdy0_2004
  • 2016年10月13日 20:34
  • 999

关于C初始化内存

关于C初始化内存
  • cary_1991
  • cary_1991
  • 2015年04月23日 09:23
  • 723

内存的初始化

内存的初始化
  • qq_36016407
  • qq_36016407
  • 2017年03月29日 10:23
  • 371

快速初始化内存(1)

快速初始化内存 许多计算密集型的应用都需要处理大量内存,这种应用中的内存初始化是一个常规操作,而内存和CPU内部的数据交换之间的速度瓶颈决定了内存初始化将会占用可观的时间。但因为应用程序初始化内存往往...
  • jerrylhw
  • jerrylhw
  • 2004年05月10日 12:19
  • 481

C语言动态内存分配:(二)malloc/calloc/realloc/aligned_malloc

malloc/calloc/realloc区别,使用示例
  • zxx910509
  • zxx910509
  • 2017年03月17日 22:02
  • 439

两张内存变化图揭秘二维数组的初始化

一 代码示例 public class TwoDimensionTest { public static void main(String[] args) { // 定义一个二维数组...
  • chengqiuming
  • chengqiuming
  • 2017年04月12日 09:52
  • 190

06 初始化SDRAM

初始化SDRAM
  • czg13548930186
  • czg13548930186
  • 2017年02月06日 15:10
  • 601
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速初始化内存(2)
举报原因:
原因补充:

(最多只允许输入30个字)