|
@@ -24,6 +24,7 @@
|
|
|
|
|
|
static const char *length_str = "1MB";
|
|
|
static const char *routine = "default";
|
|
|
+static int iterations = 1;
|
|
|
static bool use_clock;
|
|
|
static int clock_fd;
|
|
|
static bool only_prefault;
|
|
@@ -35,6 +36,8 @@ static const struct option options[] = {
|
|
|
"available unit: B, MB, GB (upper and lower)"),
|
|
|
OPT_STRING('r', "routine", &routine, "default",
|
|
|
"Specify routine to copy"),
|
|
|
+ OPT_INTEGER('i', "iterations", &iterations,
|
|
|
+ "repeat memcpy() invocation this number of times"),
|
|
|
OPT_BOOLEAN('c', "clock", &use_clock,
|
|
|
"Use CPU clock for measuring"),
|
|
|
OPT_BOOLEAN('o', "only-prefault", &only_prefault,
|
|
@@ -121,6 +124,7 @@ static u64 do_memcpy_clock(memcpy_t fn, size_t len, bool prefault)
|
|
|
{
|
|
|
u64 clock_start = 0ULL, clock_end = 0ULL;
|
|
|
void *src = NULL, *dst = NULL;
|
|
|
+ int i;
|
|
|
|
|
|
alloc_mem(&src, &dst, len);
|
|
|
|
|
@@ -128,7 +132,8 @@ static u64 do_memcpy_clock(memcpy_t fn, size_t len, bool prefault)
|
|
|
fn(dst, src, len);
|
|
|
|
|
|
clock_start = get_clock();
|
|
|
- fn(dst, src, len);
|
|
|
+ for (i = 0; i < iterations; ++i)
|
|
|
+ fn(dst, src, len);
|
|
|
clock_end = get_clock();
|
|
|
|
|
|
free(src);
|
|
@@ -140,6 +145,7 @@ static double do_memcpy_gettimeofday(memcpy_t fn, size_t len, bool prefault)
|
|
|
{
|
|
|
struct timeval tv_start, tv_end, tv_diff;
|
|
|
void *src = NULL, *dst = NULL;
|
|
|
+ int i;
|
|
|
|
|
|
alloc_mem(&src, &dst, len);
|
|
|
|
|
@@ -147,7 +153,8 @@ static double do_memcpy_gettimeofday(memcpy_t fn, size_t len, bool prefault)
|
|
|
fn(dst, src, len);
|
|
|
|
|
|
BUG_ON(gettimeofday(&tv_start, NULL));
|
|
|
- fn(dst, src, len);
|
|
|
+ for (i = 0; i < iterations; ++i)
|
|
|
+ fn(dst, src, len);
|
|
|
BUG_ON(gettimeofday(&tv_end, NULL));
|
|
|
|
|
|
timersub(&tv_end, &tv_start, &tv_diff);
|