8 #include "../fio_time.h"
9 #include "../gettime.h"
12 #define BUF_SIZE 32 * 1024 * 1024ULL
23 static struct memcpy_test tests[] = {
57 .name = "131072 bytes",
61 .name = "262144 bytes",
65 .name = "524288 bytes",
76 void (*fn)(struct memcpy_test *);
86 #define do_test(test, fn) do { \
91 for (i = 0; i < NR_ITERS; i++) { \
99 (fn)(dst, src, this); \
107 static void t_memcpy(struct memcpy_test *test)
109 do_test(test, memcpy);
112 static void t_memmove(struct memcpy_test *test)
114 do_test(test, memmove);
117 static void simple_memcpy(void *dst, void const *src, size_t len)
126 static void t_simple(struct memcpy_test *test)
128 do_test(test, simple_memcpy);
131 static void t_hybrid(struct memcpy_test *test)
133 if (test->size >= 64)
134 do_test(test, simple_memcpy);
136 do_test(test, memcpy);
139 static struct memcpy_type t[] = {
165 static unsigned int get_test_mask(const char *type)
167 char *ostr, *str = strdup(type);
174 while ((name = strsep(&str, ",")) != NULL) {
175 for (i = 0; t[i].name; i++) {
176 if (!strcmp(t[i].name, name)) {
187 static int list_types(void)
191 for (i = 0; t[i].name; i++)
192 printf("%s\n", t[i].name);
197 static int setup_tests(void)
199 struct memcpy_test *test;
200 struct frand_state state;
204 src = malloc(BUF_SIZE);
205 dst = malloc(BUF_SIZE);
212 init_rand_seed(&state, 0x8989, 0);
213 fill_random_buf(&state, src, BUF_SIZE);
215 for (i = 0; tests[i].name; i++) {
224 static void free_tests(void)
230 int fio_memcpy_test(const char *type)
232 unsigned int test_mask = 0;
237 else if (!strcmp(type, "help") || !strcmp(type, "list"))
240 test_mask = get_test_mask(type);
243 fprintf(stderr, "fio: unknown hash `%s`. Available:\n", type);
248 fprintf(stderr, "setting up mem regions failed\n");
252 for (i = 0; t[i].name; i++) {
257 if (!(t[i].mask & test_mask))
261 * For first run, make sure CPUs are spun up and that
262 * we've touched the data.
267 printf("%s\n", t[i].name);
269 for (j = 0; tests[j].name; j++) {
270 fio_gettime(&ts, NULL);
272 usec = utime_since_now(&ts);
275 unsigned long long mb = NR_ITERS * BUF_SIZE;
277 mb_sec = (double) mb / (double) usec;
278 mb_sec /= (1.024 * 1.024);
279 printf("\t%s:\t%8.2f MiB/sec\n", tests[j].name, mb_sec);
281 printf("\t%s:inf MiB/sec\n", tests[j].name);