代码之家  ›  专栏  ›  技术社区  ›  photo_tom

在Windows 7/64上使用VirtualAllocExNuma时内存访问时间慢

  •  7
  • photo_tom  · 技术社区  · 15 年前

    在我们的应用程序中,我们运行在一个双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);
    

    在win7/64上使用VS2008,代码可以正常工作。

    在我们的应用程序中,这个内存块作为静态对象(1-2mb ea)的缓存存储,这些静态对象通常存储在硬盘上。我的问题是,当我们使用memcpy将数据传输到缓存区域时,所花费的时间是使用memcpy分配内存所花费时间的10倍 new char[xxxx]

    我们无法理解为什么会发生这种情况。关于去哪儿找有什么建议吗?

    1 回复  |  直到 15 年前
        1
  •  8
  •   Hans Passant    15 年前