diff options
-rw-r--r-- | cacount.cpp | 15 | ||||
-rw-r--r-- | mmalloc.hpp | 52 |
2 files changed, 54 insertions, 13 deletions
diff --git a/cacount.cpp b/cacount.cpp index 012f33b..7abda2f 100644 --- a/cacount.cpp +++ b/cacount.cpp @@ -11,8 +11,7 @@ #include <set> #include <thread> -#include <sys/mman.h> - +#include "mmalloc.hpp" #include "packed_array.hpp" #include "timer.hpp" @@ -20,7 +19,7 @@ using namespace std; using boost::optional; #ifndef BIT_WIDTH -#define BIT_WIDTH 16 +#define BIT_WIDTH 30 #endif typedef uint64_t State; @@ -166,16 +165,6 @@ void printTraj(State s, int count) { } } -template<typename T> -T* mmalloc() { - void *p = MAP_FAILED; - for (auto flag : {MAP_POPULATE | MAP_HUGETLB, MAP_POPULATE, 0}) - if (p == MAP_FAILED) - p = mmap(NULL, sizeof(Trans), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | flag, -1, 0); - assert(p != MAP_FAILED); - return (T*) p; -} - int main(int argc, char **argv) { assert(argc >= 2); rule = atoi(argv[1]); diff --git a/mmalloc.hpp b/mmalloc.hpp new file mode 100644 index 0000000..a794a34 --- /dev/null +++ b/mmalloc.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include <initializer_list> +#include <stdio.h> +#include <sys/mman.h> +#include <unistd.h> + +void *malloc_hugetlbfs(size_t size) { +void *r; + char tmpName[] = "/mnt/hugetlbfs/mmallocXXXXXX"; + int fd = mkstemp(tmpName); + if (fd < 0) goto fail1; + + if (ftruncate(fd, size) != 0) goto fail2; + + r = mmap(NULL, + size, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + fd, 0); + if (r == MAP_FAILED) goto fail2; + + return r; + + fail2: + close(fd); + fail1: + perror(NULL); + return MAP_FAILED; +} + +void *malloc_mmap(size_t size) { + void *r; + for (auto flag : {MAP_POPULATE | MAP_HUGETLB, MAP_POPULATE, 0}) { + fprintf(stderr, "try %i", flag); + r = mmap(NULL, size, + PROT_READ | PROT_WRITE, + flag | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (r != MAP_FAILED) break; + perror("mmap"); + } + return r; +} + +template<typename T> +T* mmalloc() { + void *r; + if ((r = malloc_hugetlbfs(sizeof(T))) == MAP_FAILED) + if ((r = malloc_mmap(sizeof(T))) == MAP_FAILED) + exit(EXIT_FAILURE); + return (T*) r; +} |