ss928_framework/libapi/sys/libapi_mem.c

132 lines
3.8 KiB
C
Raw Permalink Normal View History

2024-12-16 13:31:45 +08:00
// #include <stdio.h>
// #include <stdlib.h> /* rand, srand */
// #include <string.h>
// #include <assert.h>
// #include <sys/time.h>
// #include <time.h> /* 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;
// // }