diff options
Diffstat (limited to 'main.cpp')
-rw-r--r-- | main.cpp | 56 |
1 files changed, 46 insertions, 10 deletions
@@ -2,9 +2,10 @@ #include <unistd.h> #include <sys/mman.h> #include <string> +#include <omp.h> -#define GIG (1024*1024*1024ul) -#define VOLUME (2ul*GIG) +#define GIG (1024ul*1024*1024) +#define VOLUME (1024ul*1024*1024) // Real values is in the ~65536, only use half of it to be safe // sysctl vm.max_map_count @@ -13,16 +14,51 @@ int main(int argc, char **argv) { auto page_size = sysconf(_SC_PAGESIZE); std::cout << "The system have a page size of " << page_size << std::endl; - auto dst = (long*)malloc(VOLUME); // Src is using anonymous mapping - long nmaps = std::stoi(argv[1]); - if (GIG % (page_size * nmaps) != 0) { - std::cout << "nmaps is not perfect multiple" << std::endl; - nmaps = GIG / (page_size * nmaps); + long nmaps = 1024; + if (argc > 1) { + nmaps = std::stoi(argv[1]); + if (VOLUME / page_size % nmaps != 0) { + std::cout << "nmaps is not perfect multiple, quit" << std::endl; + return 0; + } } - std::cout << argv[1] << std::endl; + + long mmap_sz = VOLUME / nmaps; + std::cout << "Each mapped region is of size(pages) " << mmap_sz/page_size << std::endl; + + auto dst = (long*)malloc(VOLUME); + uint8_t *hint = (uint8_t*)0x600000000000UL; - mmap(hint); - auto src = + hint -= VOLUME; + auto src = (long*)hint; + for (long i = 0; i < nmaps; ++i) { + auto r = mmap(hint, mmap_sz, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); + if (r == MAP_FAILED || r != hint) + printf("MMAP failed somehow\n"); + hint += mmap_sz; + } + +#pragma omp parallel for + for (long i = 0; i < VOLUME/sizeof(long); ++i) { + src[i] = i; + dst[i] = 0; + } + + int ITER = 100; + double st = omp_get_wtime(); + + for (int t = 0; t < ITER; ++t) { +#pragma omp parallel for + for (long i = 0; i < VOLUME/sizeof(long); ++i) + dst[i] = src[i]; + } + + st = (omp_get_wtime() - st) / ITER; + + printf("Average time(s) %f\n", st); +// std::cout << "Average time(s) " << st << std::endl; + printf("Average throughput(GB/s) %f\n", VOLUME * 2 / st * 1e-9); +// std::cout << "Average throughput(GB/s) " << VOLUME * 2 / st * 1e-9 << std::endl; return 0; } |