【问题标题】:Memory access time slow with VirtualAllocExNuma on Windows 7/64在 Windows 7/64 上使用 VirtualAllocExNuma 的内存访问时间很慢
【发布时间】:2011-04-15 08:51:38
【问题描述】:

在我们的应用程序中,我们在双 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 倍以上。并且没有其他代码更改。

我们不知道为什么会发生这种情况。关于在哪里看有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    PAGE_NOCACHE 在性能上是谋杀,它禁用 CPU 缓存。这是故意的吗?

    【讨论】:

    • 没有。那不是我的本意。我曾认为禁用了内存块的磁盘缓存,而不是 CPU。这确实解决了我的大部分性能问题。谢谢。
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2016-09-21
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多