ss928_framework/libapi/sys/libapi_mem.c
2024-12-16 13:31:45 +08:00

132 lines
3.8 KiB
C
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// #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;
// // }