|
我用的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.
- LARGE_INTEGER freq, t1, t2;
- QueryPerformanceFrequency(&freq);
- #define TESTSIZE 0x100000//4MB
- unsigned int * p1 = new unsigned int[TESTSIZE];
- unsigned int * p2 = new unsigned int[TESTSIZE];
- if (p1==NULL || p2==NULL)
- {
- return;
- }
- unsigned int * p3 = p1;
- unsigned int * p4 = p2;
- //CacheSync(CACHE_SYNC_DISCARD);//flush and clean cache
- QueryPerformanceCounter(&t1);
- for (int i=TESTSIZE; i!=0; i-=4)//memcpy, expand 4
- {
- *(p3++) = *(p4++);
- *(p3++) = *(p4++);
- *(p3++) = *(p4++);
- *(p3++) = *(p4++);
- }
- //CacheSync(CACHE_SYNC_WRITEBACK);//write back dirty data
- QueryPerformanceCounter(&t2);
- delete [] p1;
- delete [] p2;
-
- unsigned int t = (unsigned int)( (1000000*(t2.QuadPart - t1.QuadPart))/freq.QuadPart );// time : micro second
- if (t!=0)
- {
- unsigned int speed = (sizeof(unsigned int)*TESTSIZE)/t;//speed: MB/second
-
- if (0)//use MFC
- {
- CString str;
- str.Format(TEXT("memcpy speed: %d MB/second"), speed);
- MessageBox(NULL, str, _T("Result"), MB_OK);
- }
- else//use UART
- {
- RETAILMSG(1, (TEXT("memcpy speed: %d MB/second \r\n"), speed));
- }
- }
复制代码
|
|