SMP使用参考
1. SMP说明¶
当前提供的SDK中每个product config均开启了SMP功能,可根据相关选项CONFIG_CPU_HOTPLUG_SUPPORT = TRUE
、CONFIG_HW_CORE_NUM = 2
、CONFIG_CORE_NUM = 2
、CONFIG_HW_TO_LOGICAL_CORE_ID_MAP = 0,1
来确定。目前用户无法通过mak配置修改决定是否开启SMP,但可以在代码中指定相应的任务绑定在哪个核上运行,实现单核任务的运行。
2. 绑核操作¶
-
包含头文件
cam_os_wrapper.h
-
在用户使用
CamOsThreadCreate
创建任务后,可使用CamOsThreadSetAffinity
这个接口来指定任务在哪个核上运行,以下做个简单的示例:CamOsThreadCreate(pstTaskHandle, &tAttr, (void *)task_handle, NULL); MI_U32 affinity = 0; affinity = (1 << 0);// bind core0 //affinity = (1 << 1);// bind core1 CamOsThreadSetAffinity(*pstTaskHandle, (const CamOsCpuMask_t *)&affinity);
-
可通过提供的
taskstat
命令,找到创建的任务,在相应行查看AFFI
的值来确定当前绑定在哪个核上。AFFI
为0x01表示绑定在核0,0x02表示绑定在核1,0xFF表示均有运行。PerCPU
表示对应核上的任务占用率。CPU
表示多个核加起来任务占用率,最大为N*100.0
,N表示当前共有几个核。
3. SMP影响¶
-
由于核间切换导致线程的栈开销变大,所以出现原本单核可以运行的线程,加入smp功能后出现stack over flow,将对应线程的栈加大即可解决
-
core1和core0是同时进行的,所以对共同资源(内存)需要进行锁保护。
-
强转导致非法内存访问的问题,测试时遇到int强转为float出现非法内存访问。
-
系统内存占用加大,实测开启SMP与不开启SMP时通过
memstat
对比系统内存相差1MB。