// #include // #include /* rand, srand */ // #include // #include // #include // #include /* time() */ // /* // * 在uncache区域memcpy时通常很慢,下面是一些优化: // */ // /* arm下的memcpy实现: */ // void memcpy_neon(volatile void *dst, volatile void *src, int sz) // { // if (sz & 63) { // sz = (sz & -64) + 64; // } // asm volatile ( // "NEONCopy: \n" // " VLDM %[src]!,{d0-d7} \n" // " VSTM %[dst]!,{d0-d7} \n" // " SUBS %[sz],%[sz],#0x40 \n" // " BGT NEONCopy \n" // : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory"); // } // /* // * arm64 // */ // /* uncached 区域: */ // void memcpy_uncached(volatile void *dst, volatile void *src, int sz) // { // if (sz & 63) { // sz = (sz & -64) + 64; // } // asm volatile ( // "sub %[dst], %[dst], #64 \n" // "1: \n" // "ldnp q0, q1, [%[src]] \n" // "ldnp q2, q3, [%[src], #32] \n" // "add %[dst], %[dst], #64 \n" // "subs %[sz], %[sz], #64 \n" // "add %[src], %[src], #64 \n" // "stnp q0, q1, [%[dst]] \n" // "stnp q2, q3, [%[dst], #32] \n" // "b.gt 1b \n" // : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory"); // } // /* cached 区域: */ // void memcpy_cached(volatile void *dst, volatile void *src, int sz) // { // if (sz & 63) { // sz = (sz & -64) + 64; // } // asm volatile ( // "sub %[src], %[src], #32 \n" // "sub %[dst], %[dst], #32 \n" // "1: \n" // "ldp q0, q1, [%[src], #32] \n" // "ldp q2, q3, [%[src], #64]! \n" // "subs %[sz], %[sz], #64 \n" // "stp q0, q1, [%[dst], #32] \n" // "stp q2, q3, [%[dst], #64]! \n" // "b.gt 1b \n" // : [dst]"+r"(dst), [src]"+r"(src), [sz]"+r"(sz) : : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "cc", "memory"); // } // static void get_rand_bytes(unsigned char *data, int len) // { // int i; // srand((unsigned)time(NULL)); //种下随机种子 // for (i = 0; i < len; i++) { // data[i] = rand() % 255; //取随机数,并保证数在0-255之间 // //printf("%02X ", data[i]); // } // } // static int get_cur_time_us(void) // { // struct timeval tv; // gettimeofday(&tv, NULL); //使用gettimeofday获取当前系统时间 // return (tv.tv_sec * 1000 * 1000 + tv.tv_usec); //利用struct timeval结构体将时间转换为ms // } // #define ARRAY_SIZE(n) sizeof(n) / sizeof(n[0]) // // int main(void) // // { // // int size_list[] = { // // 1024 * 1024 * 10, // 10MB // // 1024 * 1024 * 1, // 1MB // // 1024 * 100, // 100KB // // 1024 * 10, // 10KB // // 1024 * 1, // 1KB // // }; // // char *data1; // // char *data2; // // int t1; // // int t2; // // int i = 0; // // data1 = (char *)malloc(size_list[0]); // // data2 = (char *)malloc(size_list[0]); // // get_rand_bytes((unsigned char *)data1, size_list[0]); // // for (i = 0; i < ARRAY_SIZE(size_list); i++) { // // t1 = get_cur_time_us(); // // memcpy(data2, data1, size_list[i]); // // t2 = get_cur_time_us(); // // printf("copy %d bytes, memcpy waste time %dus\n", size_list[i], t2 - t1); // // t1 = get_cur_time_us(); // // memcpy_uncached(data2, data1, size_list[i]); // // t2 = get_cur_time_us(); // // printf("copy %d bytes, memcpy_uncached waste time %dus\n", size_list[i], t2 - t1); // // t1 = get_cur_time_us(); // // memcpy_cached(data2, data1, size_list[i]); // // t2 = get_cur_time_us(); // // printf("copy %d bytes, memcpy_cached waste time %dus\n\n", size_list[i], t2 - t1); // // } // // free(data1); // // free(data2); // // return 0; // // }