通过在 Win/Linux 上使用 C/C++ 来使用大页面分配内存的最简单方法是什么?
What is the simplest way to allocate memory with hugepages by using C/C++ on Win/Linux?
通过在 C/C++ 中使用 WINAPI/POSIX 在具有大页面(页面大小为 2 MB 或 1 GB)的 user-space 中分配内存的最简单方法是什么? =27=]?
CPU: x84_64
- WINAPI: Windows x64 7/10/服务器 2012
- POSIX: Linux x64(现代内核)
Huge/Large 页面大小:https://en.wikipedia.org/wiki/Page_(computer_memory)#Huge_pages
WINAPI:
VirtualAlloc.
// alocate 1 MB
void* data = VirtualAlloc( NULL, 1024 * 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
malloc 或 new 有什么问题?
使用 Linux,您可以将 MAP_HUGETLB
(也可能 MAP_HUGE_2MB
等...)传递给 mmap(2) (or perhaps mmap2(2)...)
另请参阅内核的 Documentation/vm/hugetlbpage.txt
血淋淋的细节可以是特定于硬件、内核和计算机的。参见 /proc/meminfo
和 proc(5)
(因此,如果 mmap
和 MAP_HUGETLB
失败,请尝试不使用它...)。
顺便说一句,您可能有一些 malloc
或 posix_memalign(3) 的实现,它们可能会在适当的时候尝试 mmap
和 MAP_HUGETLB
。
通过在 C/C++ 中使用 WINAPI/POSIX 在具有大页面(页面大小为 2 MB 或 1 GB)的 user-space 中分配内存的最简单方法是什么? =27=]?
CPU: x84_64
- WINAPI: Windows x64 7/10/服务器 2012
- POSIX: Linux x64(现代内核)
Huge/Large 页面大小:https://en.wikipedia.org/wiki/Page_(computer_memory)#Huge_pages
WINAPI: VirtualAlloc.
// alocate 1 MB
void* data = VirtualAlloc( NULL, 1024 * 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
malloc 或 new 有什么问题?
使用 Linux,您可以将 MAP_HUGETLB
(也可能 MAP_HUGE_2MB
等...)传递给 mmap(2) (or perhaps mmap2(2)...)
另请参阅内核的 Documentation/vm/hugetlbpage.txt
血淋淋的细节可以是特定于硬件、内核和计算机的。参见 /proc/meminfo
和 proc(5)
(因此,如果 mmap
和 MAP_HUGETLB
失败,请尝试不使用它...)。
顺便说一句,您可能有一些 malloc
或 posix_memalign(3) 的实现,它们可能会在适当的时候尝试 mmap
和 MAP_HUGETLB
。