赞
踩
cmake获取平台信息:set(PLATFORM = $(strip $(shell echo `uname -m`)))
1. 编译参数
arm平台不支持“-m32"和“-m64"这样的编译参数。取而代之用 “-mabi=ilp32“ 和 “-mabi=lp64” 代替。还可以在指定 cpu的架构版本,如:
bazel build --cxxopt="-march=armv8-a" --cpu aarch64 ...
2. 内存对齐
arm平台默认的内存pagesize 和 x86平台不一致。
3. 原子操作
4.获取精确时间
#ifdef __aarch64__
#define RDTSC() ({ uint64_t time; __asm__ __volatile__ ("mrs %0, PMCCNTR_EL0" : "+r" (time)); time; })
#elif defined( __x86_64__)
#define RDTSC() ({ register uint32_t a,d; __asm__ __volatile__( "rdtsc" : "=a"(a), "=d"(d)); (((uint64_t)a)+(((uint64_t)d)<<32)); })
#else
#define RDTSC() ({ register uint64_t time; __asm__ __volatile__( "rdtsc" : "=A"(time)); time; })
5.内存屏障差异
#ifdef __aarch64__
#define CAS32(ptr, val_old, val_new) __sync_bool_compare_and_swap(ptr, val_old, val_new)
#define wmb() asm volatile("dmb ishst" ::: "memory")
#define rmb() asm volatile("dmb ishld" ::: "memory")
#else
#define CAS32(ptr, val_old, val_new)({ char ret; __asm__ __volatile__("lock; cmpxchgl %2,%0; setz %1": "+m"(*ptr), "=q"(ret): "r"(val_new),"a"(val_old): "memory"); ret;})
#define wmb() __asm__ __volatile__("sfence":::"memory")
#define rmb() __asm__ __volatile__("lfence":::"memory")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。