7 #include "../fio_time.h"
8 #include "../gettime.h"
11 #define BUF_SIZE 32 * 1024 * 1024ULL
22 static struct memcpy_test tests[] = {
56 .name = "131072 bytes",
60 .name = "262144 bytes",
64 .name = "524288 bytes",
75 void (*fn)(struct memcpy_test *);
85 #define do_test(test, fn) do { \
90 for (i = 0; i < NR_ITERS; i++) { \
98 (fn)(dst, src, this); \
106 static void t_memcpy(struct memcpy_test *test)
108 do_test(test, memcpy);
111 static void t_memmove(struct memcpy_test *test)
113 do_test(test, memmove);
116 static void simple_memcpy(void *dst, void const *src, size_t len)
125 static void t_simple(struct memcpy_test *test)
127 do_test(test, simple_memcpy);
130 static void t_hybrid(struct memcpy_test *test)
132 if (test->size >= 64)
133 do_test(test, simple_memcpy);
135 do_test(test, memcpy);
138 static struct memcpy_type t[] = {
164 static unsigned int get_test_mask(const char *type)
166 char *ostr, *str = strdup(type);
173 while ((name = strsep(&str, ",")) != NULL) {
174 for (i = 0; t[i].name; i++) {
175 if (!strcmp(t[i].name, name)) {
186 static int list_types(void)
190 for (i = 0; t[i].name; i++)
191 printf("%s\n", t[i].name);
196 static int setup_tests(void)
198 struct memcpy_test *test;
199 struct frand_state state;
203 src = malloc(BUF_SIZE);
204 dst = malloc(BUF_SIZE);
211 init_rand_seed(&state, 0x8989, 0);
212 fill_random_buf(&state, src, BUF_SIZE);
214 for (i = 0; tests[i].name; i++) {
223 static void free_tests(void)
229 int fio_memcpy_test(const char *type)
231 unsigned int test_mask = 0;
236 else if (!strcmp(type, "help") || !strcmp(type, "list"))
239 test_mask = get_test_mask(type);
242 fprintf(stderr, "fio: unknown hash `%s`. Available:\n", type);
247 fprintf(stderr, "setting up mem regions failed\n");
251 for (i = 0; t[i].name; i++) {
256 if (!(t[i].mask & test_mask))
260 * For first run, make sure CPUs are spun up and that
261 * we've touched the data.
266 printf("%s\n", t[i].name);
268 for (j = 0; tests[j].name; j++) {
269 fio_gettime(&ts, NULL);
271 usec = utime_since_now(&ts);
274 unsigned long long mb = NR_ITERS * BUF_SIZE;
276 mb_sec = (double) mb / (double) usec;
277 mb_sec /= (1.024 * 1.024);
278 printf("\t%s:\t%8.2f MiB/sec\n", tests[j].name, mb_sec);
280 printf("\t%s:inf MiB/sec\n", tests[j].name);