Windows 7/64上的VirtualAllocExNuma内存访问时间较慢

时间:2010-09-21 18:35:46

标签: c++ visual-studio-2008 windows-7 numa

在我们的应用程序中,我们运行的是双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, 0, _allocateAmt, 
            MEM_COMMIT | MEM_RESERVE ,
            PAGE_READWRITE| PAGE_NOCACHE , nodeNumber);

代码原样,在Win 7/64上使用VS2008正常工作。

在我们的应用程序中,这块内存用作静态对象(1-2mb ea)的缓存存储,通常存储在硬盘驱动器上。我的问题是,当我们使用memcpy将数据传输到缓存区域时,需要>比使用new char[xxxx]分配内存的时间长10倍。并且没有其他代码更改。

我们无法理解为什么会这样。关于在哪里看的任何建议?

1 个答案:

答案 0 :(得分:7)

PAGE_NOCACHE是perf的谋杀案,它会禁用CPU缓存。这是故意的吗?