在我们的应用程序中,我们运行的是双Xeon服务器,每个处理器的内存配置为12gb,连接两个Xeon的内存总线.出于性能原因,我们希望控制分配大(> 6gb)内存块的位置.以下是简化代码 –
DWORD processorNumber = GetCurrentProcessorNumber(); UCHAR nodeNumber = 255; GetNumaProcessorNode((UCHAR)processorNumber,&nodeNumber ); // get amount of physical memory available of node. ULONGLONG availableMemory = MAXLONGLONG; GetNumaAvailableMemoryNode(nodeNumber,&availableMemory ) // make sure that we don't request too much. Initial limit will be 75% of available memory _allocateAmt = qMin(requestedMemory,availableMemory * 3 / 4); // allocate the cached memory region Now. HANDLE handle = (HANDLE)GetCurrentProcess (); cacheObject = (char*) VirtualAllocExnuma (handle,_allocateAmt,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE| PAGE_NOCACHE,nodeNumber);
代码原样,在Win 7/64上使用VS2008正常工作.
在我们的应用程序中,这块内存用作静态对象(1-2mb ea)的缓存存储,通常存储在硬盘驱动器上.我的问题是,当我们使用memcpy将数据传输到缓存区域时,它需要>比使用new char [xxxx]分配内存的时间长10倍.没有其他代码更改.
我们无法理解为什么会这样.关于在哪里看的任何建议?
解决方法
PAGE_NOCACHE是perf的谋杀案,它会禁用cpu缓存.这是故意的吗?
原文地址:https://www.jb51.cc/c/119159.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。