#include #include // https://github.com/evanj/hugepagedemo using namespace std; int main() { static const size_t FOUR_GIB_IN_BYTES = UINT64_C(4) << 30; static const size_t HUGE_2MIB_ALIGNMENT = UINT64_C(2) << 20; static const size_t HUGE_2MIB_MASK = HUGE_2MIB_ALIGNMENT - 1; static const size_t HUGE_1GIB_ALIGNMENT = UINT64_C(1) << 30; static const size_t HUGE_1GIB_MASK = HUGE_1GIB_ALIGNMENT - 1; bitset<31> huge_2mib_alignment(HUGE_2MIB_ALIGNMENT); bitset<31> huge_2mib_mask(HUGE_2MIB_MASK); bitset<31> huge_1gib_alignment(HUGE_1GIB_ALIGNMENT); bitset<31> huge_1gib_mask(HUGE_1GIB_MASK); cout << "FOUR_GIB_IN_BYTES : " << FOUR_GIB_IN_BYTES << " 2^32: " << (uint64_t) pow(2,32) << endl; cout << "HUGE_2MIB_ALIGNMENT : " << HUGE_2MIB_ALIGNMENT << endl; cout << "HUGE_2MIB_ALIGNMENT : " << huge_2mib_alignment.to_string() << endl; cout << "HUGE_2MIB_MASK : " << HUGE_2MIB_MASK << endl; cout << "HUGE_2MIB_MASK : " << huge_2mib_mask.to_string() << endl; cout << "HUGE_1GIB_ALIGNMENT : " << HUGE_1GIB_ALIGNMENT << endl; cout << "HUGE_1GIB_ALIGNMENT : " << huge_1gib_alignment.to_string() << endl; cout << "HUGE_1GIB_MASK : " << HUGE_1GIB_MASK << endl; cout << "HUGE_1GIB_MASK : " << huge_1gib_mask.to_string() << endl; void *plain_malloc = malloc(FOUR_GIB_IN_BYTES); printf("malloc 4GiB = %p; 2MiB aligned? %d; 1GiB aligned? %d\n", plain_malloc, ((size_t)plain_malloc & HUGE_2MIB_MASK) == 0, ((size_t)plain_malloc & HUGE_1GIB_MASK) == 0); free(plain_malloc); void *aligned = aligned_alloc(HUGE_1GIB_ALIGNMENT, FOUR_GIB_IN_BYTES); printf("aligned_alloc 4GiB = %p; 2MiB aligned? %d; 1GiB aligned? %d\n", aligned, ((size_t)aligned & HUGE_2MIB_MASK) == 0, ((size_t)aligned & HUGE_1GIB_MASK) == 0); madvise(aligned, FOUR_GIB_IN_BYTES, MADV_WILLNEED); memset(aligned, 1, FOUR_GIB_IN_BYTES); // cout << "sleeping..." << endl; //this_thread::sleep_for(chrono::seconds(60)); free(aligned); return 0; }