2010-09-21 60 views
7

Trong ứng dụng của chúng tôi, chúng tôi đang chạy trên một máy chủ Xeon kép với bộ nhớ được cấu hình là 12GB cục bộ cho mỗi bộ xử lý và bus bộ nhớ kết nối hai Xeon. Vì lý do hiệu suất, chúng tôi muốn kiểm soát nơi chúng tôi phân bổ khối bộ nhớ lớn (> 6gb). Dưới đây là mã được đơn giản hóa -Thời gian truy cập bộ nhớ chậm với VirtualAllocExNuma trên Windows 7/64

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); 

Mã hoạt động chính xác khi sử dụng VS2008 trên Win 7/64.

Trong ứng dụng của chúng tôi, khối chức năng bộ nhớ này là bộ nhớ cache cho các đối tượng tĩnh (1-2mb ea) thường được lưu trữ trên ổ đĩa cứng. Vấn đề của tôi là khi chúng tôi chuyển dữ liệu vào vùng bộ nhớ cache bằng memcpy, phải mất> 10 lần lâu hơn nếu chúng tôi cấp phát bộ nhớ bằng cách sử dụng new char[xxxx]. Và không có thay đổi mã nào khác.

Chúng tôi không hiểu tại sao điều này lại xảy ra. Bất kỳ đề xuất nào về nơi để tìm?

Trả lời

7

PAGE_NOCACHE là kẻ giết người khi hoàn thiện, nó vô hiệu hóa bộ nhớ cache CPU. Điều đó có chủ ý không?

+1

No. Đó không phải là những gì tôi dự định. Tôi đã nghĩ rằng bộ nhớ đệm đĩa bị vô hiệu hóa của khối bộ nhớ, không phải CPU. Điều đó đã giải quyết hầu hết các vấn đề về hiệu suất của tôi. Cảm ơn. –

Các vấn đề liên quan