12 int fd = open(
"/proc/self/pagemap", O_RDONLY);
14 const int page_size = 4096;
15 uint64_t virt_pfn = (uint64_t)Buf / page_size;
16 off_t offset =
sizeof(uint64_t) * virt_pfn;
17 uint64_t npages = (BYTES + page_size-1) / page_size;
18 std::vector<uint64_t> pagedata(npages);
19 uint64_t ret = lseek(fd, offset, SEEK_SET);
20 assert(ret == offset);
21 ret = ::read(fd, &pagedata[0],
sizeof(uint64_t)*npages);
22 assert(ret ==
sizeof(uint64_t) * npages);
23 int nhugepages = npages / 512;
24 int n4ktotal, nnothuge;
27 for (
int i = 0; i < nhugepages; ++i) {
28 uint64_t baseaddr = (pagedata[i*512] & 0x7fffffffffffffULL) * page_size;
29 for (
int j = 0; j < 512; ++j) {
30 uint64_t pageaddr = (pagedata[i*512+j] & 0x7fffffffffffffULL) * page_size;
32 if (pageaddr != baseaddr + j * page_size)
37 printf(
"rank %d Allocated %d 4k pages, %d not in huge pages\n", rank, n4ktotal, nnothuge);