8

このアプリケーションでは、各プロセッサに対してローカルで12GBとして構成されたメモリと、2つのXeonを接続するメモリバスを備えたデュアル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〜2 MB EA)のキャッシュストアとして機能します。私の問題は、memcpyを使用してデータをキャッシュ領域に転送する場合、を使用してメモリを割り当てる場合の10倍以上の時間がかかることnew char[xxxx]です。そして、他のコードは変更されません。

なぜこれが起こっているのか理解するのに途方に暮れています。どこを見るべきかについて何か提案はありますか?

4

1 に答える 1

9

PAGE_NOCACHEはperfでの殺人であり、CPUキャッシュを無効にします。それは意図的でしたか?

于 2010-09-21T18:41:07.513 に答える