4964|8

83

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

你们的系统上memcpy的速度如何? [复制链接]

我用的s3c6410+wince6.0,内存是外频133M的mDDR,CAS=3,burst=4,用的是友坚的BSP和核心板。
在启动了cache, write-buffer,write-back等功能之后,理论读取速度应该是4*(133*4/(3+2))大约400MB,写入也是这么多。
可是测试程序运行时间的时候,发现内存访问速度远远不如上述计算,读取为200MB左右。写入为22M次(写入char,short,int分别是22MB,44MB,88MB)。
我怀疑是没有使用write-back,而是使用了write-through的缘故。ARM1176的文档中说这个属性在MicroTLB中,可是我在wince源码和bsp中都没发现与TLB相关的内容,所以也不知道是否在分配内存的时候使用了write-back。

各位能否在自己的系统上运行一下以下代码,测试一下速度,并说明一下OS, CPU, 存储器参数。谢谢各位的参与和讨论。
我的机器测试结果是58MB.


  1.         LARGE_INTEGER freq, t1, t2;

  2.         QueryPerformanceFrequency(&freq);


  3.         #define TESTSIZE 0x100000//4MB

  4.         unsigned int * p1 = new unsigned int[TESTSIZE];
  5.         unsigned int * p2 = new unsigned int[TESTSIZE];
  6.         if (p1==NULL || p2==NULL)
  7.         {
  8.                 return;
  9.         }

  10.         unsigned int * p3 = p1;
  11.         unsigned int * p4 = p2;

  12.         //CacheSync(CACHE_SYNC_DISCARD);//flush and clean cache

  13.         QueryPerformanceCounter(&t1);

  14.         for (int i=TESTSIZE; i!=0; i-=4)//memcpy, expand 4
  15.         {
  16.                 *(p3++) = *(p4++);
  17.                 *(p3++) = *(p4++);
  18.                 *(p3++) = *(p4++);
  19.                 *(p3++) = *(p4++);
  20.         }

  21.         //CacheSync(CACHE_SYNC_WRITEBACK);//write back dirty data

  22.         QueryPerformanceCounter(&t2);

  23.         delete [] p1;
  24.         delete [] p2;
  25.        
  26.         unsigned int t = (unsigned int)( (1000000*(t2.QuadPart - t1.QuadPart))/freq.QuadPart );// time : micro second
  27.         if (t!=0)
  28.         {
  29.                 unsigned int speed = (sizeof(unsigned int)*TESTSIZE)/t;//speed: MB/second
  30.                
  31.                 if (0)//use MFC
  32.                 {
  33.                         CString str;
  34.                         str.Format(TEXT("memcpy speed: %d MB/second"), speed);
  35.                         MessageBox(NULL, str, _T("Result"), MB_OK);
  36.                 }
  37.                 else//use UART
  38.                 {
  39.                         RETAILMSG(1, (TEXT("memcpy speed: %d MB/second \r\n"), speed));
  40.                 }
  41.         }       
复制代码

最新回复

没人回答啊  详情 回复 发表于 2010-7-1 13:14
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
mark
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
帮你顶,速度跟元件的等级有关吧
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
upupup
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
测试速度用这个代码有问题吧:
for (int i=TESTSIZE; i!=0; i-=4)//memcpy, expand 4
    {
        *(p3++) = *(p4++);
        *(p3++) = *(p4++);
        *(p3++) = *(p4++);
        *(p3++) = *(p4++);
    }

每个循环不只是读写4个byte,也在读写i,p3,p4吧。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

6
 
这点没问题。
int*指针 ++ 一次 移动 4个bytes 即一个int大小
内存的大小是TESTSIZE*sizeof(int) bytes
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
我看错了类型,
但是我意思是,判断i!=0 ,以及i-=4 也是要花时间的啊。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 rushonin 的回复:
我看错了类型,
但是我意思是,判断i!=0 ,以及i-=4 也是要花时间的啊。


这个很快的,因为cpu是532MHz, i,p3,p4都是寄存器变量,所以循环开销相对8次IO时间来说不明显。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

9
 
没人回答啊
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表