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;
207 src = malloc(BUF_SIZE);
208 dst = malloc(BUF_SIZE);
215 init_rand_seed(&state, 0x8989, 0);
216 fill_random_buf(&state, src, BUF_SIZE);
218 for (i = 0; tests[i].name; i++) {
227 static void free_tests(void)
233 int fio_memcpy_test(const char *type)
235 unsigned int test_mask = 0;
240 else if (!strcmp(type, "help") || !strcmp(type, "list"))
243 test_mask = get_test_mask(type);
246 fprintf(stderr, "fio: unknown hash `%s`. Available:\n", type);
251 fprintf(stderr, "setting up mem regions failed\n");
255 for (i = 0; t[i].name; i++) {
260 if (!(t[i].mask & test_mask))
264 * For first run, make sure CPUs are spun up and that
265 * we've touched the data.
270 printf("%s\n", t[i].name);
272 for (j = 0; tests[j].name; j++) {
273 fio_gettime(&ts, NULL);
275 usec = utime_since_now(&ts);
278 unsigned long long mb = NR_ITERS * BUF_SIZE;
280 mb_sec = (double) mb / (double) usec;
281 mb_sec /= (1.024 * 1.024);
282 printf("\t%s:\t%8.2f MiB/sec\n", tests[j].name, mb_sec);
284 printf("\t%s:inf MiB/sec\n", tests[j].name);