blob: 0cb47fa282713b25f2f77049cce4266cdf44173d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#include <iostream>
#include <unistd.h>
#include <sys/mman.h>
#include <string>
#include <omp.h>
#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
#define MAXMMAPS 32768
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;
// Src is using anonymous mapping
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;
}
}
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;
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;
}
|