“RK3399芯片如何优化进程绑定CPU核心?深度解析与实例分享“

目录

一、理解RK3399芯片架构

二、进程绑定CPU核心的策略

三、实例分享

3.1、使用shell命令方式

3.1.1、查看CPU信息

3.1.2、查看进程当前运行在哪个cpu上

3.1.3、指定进程运行在cpu1上即第二个逻辑CPU核心上

3.1.4、指定进程运行在cpu0~2上即cpu0、cpu1、cpu2三个逻辑CPU核心上

3.1.5、通过top命令查看进程cpu绑定情况

3.2、使用C++代码方式

3.2.1、sched方式

3.2.2、pthread方式

四、面临的挑战与解决方案

五、总结与展望


        RK3399芯片作为一款高性能的处理器,其多核性能的优化对于提升整体运算效率至关重要。进程绑定CPU核心是一种常见的优化手段,下面我将从不同角度对RK3399芯片如何优化进程绑定CPU核心进行深入解析,并分享一些实例。

一、理解RK3399芯片架构

        RK3399芯片采用了big.LITTLE架构,拥有两个高性能的ARM Cortex-A72核心和四个低功耗的ARM Cortex-A53核心。这种异构架构使得RK3399既能在高负载场景下提供出色的性能,又能在低负载场景下保持较低的功耗。

二、进程绑定CPU核心的策略

1. 根据进程性质绑定:将计算密集型进程绑定到高性能的A72核心上,将IO密集型进程绑定到低功耗的A53核心上。这样可以充分发挥不同核心的优势,提高整体运算效率。


2. 根据进程优先级绑定:将高优先级的进程绑定到性能更好的核心上,以确保这些进程能够获得更多的计算资源。


3. 动态绑定:根据系统的实时负载情况动态调整进程与核心之间的绑定关系。当某个核心负载较高时,可以将一些进程迁移到其他负载较低的核心上。

三、实例分享

        比如以一款运行在RK3399芯片上的图像处理应用为例,该应用需要处理大量的图像数据并进行复杂的计算。通过对该应用的进程进行绑定优化,我们将其绑定到两个Cortex-A72核心上,并充分利用了这些核心的高性能。优化后,应用的处理速度得到了显著提升,同时功耗也保持在了较低水平。

3.1、使用shell命令方式

下面以 bluesea2_node进程展开说明

3.1.1、查看CPU信息

lscpu

cat /proc/cpuinfo

3.1.2、查看进程当前运行在哪个cpu上

taskset -p $(ps -ef | grep "bluesea2_node" | grep -v "grep" | awk '{print $2}')

显示的十进制数字3转换为2进制为11,每个1对应一个cpu,所以进程运行在2个cpu上

3.1.3、指定进程运行在cpu1上即第二个逻辑CPU核心上

taskset -pc 1 $(ps -ef | grep "bluesea2_node" | grep -v "grep" | awk '{print $2}')

3.1.4、指定进程运行在cpu0~2上即cpu0、cpu1、cpu2三个逻辑CPU核心上

taskset -cp 0-2 $(ps -ef | grep "bluesea2_node" | grep -v "grep" | awk '{print $2}')

3.1.5、通过top命令查看进程cpu绑定情况

输入命令:top -p 进程ID,接着输入f,使用键盘箭头移动到P选项(移到P处,按下空格选中),按ESC退出,此时可以看到进程在cpu0 cpu1 cpu2之间不停切换。

top -p $(ps -ef | grep "bluesea2_node" | grep -v "grep" | awk '{print $2}')

#!/bin/bash

# cpu0~3 小核,cpu4~5 大核 实际情况根据每个板子有所不同

# 绑定2D雷达到cpu1

taskset -pc 1 $(ps -ef | grep "bluesea2_node" | grep -v "grep" | awk '{print $2}')

3.2、使用C++代码方式

3.2.1、sched方式

#define _GNU_SOURCE       
#include <sched.h>


int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);

参数:

pid:进程号,如果pid值为0,则表示指定当前进程。

cpusetsize:mask参数所指定数的长度,通常设定为sizeof(cpu_set_t)。

mask:CPU掩码

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
 
#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>
#include<pthread.h>
 
 
#define THREAD_MAX_NUM 10  //1个CPU内的最多进程数
int CPU_NUM = 0;  //cpu中核数
int CPU = 3; // CPU编号
 
void* threadFun(void* arg)
{
    cpu_set_t mask;  //CPU核的集合
    CPU_ZERO(&mask);
    // set CPU MASK
    CPU_SET(CPU, &mask);
    //设置当前进程的CPU Affinity
    if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
    {
        printf("warning: could not set CPU affinity, continuing...\n");
    }
 
    cpu_set_t affinity;   //获取在集合中的CPU
    CPU_ZERO(&affinity);
    // 获取当前进程的CPU Affinity
    if (sched_getaffinity(0, sizeof(affinity), &affinity) == -1)
    {
        printf("warning: cound not get Process affinity, continuing...\n");
    }
 
    int i = 0;
    for (i = 0; i < CPU_NUM; i++)
    {
        if (CPU_ISSET(i, &affinity))//判断线程与哪个CPU有亲和力
        {
            printf("this thread %d is running processor : %d\n", *((int*)arg), i);
        }
    }
 
    return NULL;
}
 
int main(int argc, char* argv[])
{
    int tid[THREAD_MAX_NUM];
    pthread_t thread[THREAD_MAX_NUM];
    // 获取核数
    CPU_NUM = sysconf(_SC_NPROCESSORS_CONF);
    printf("System has %i processor(s). \n", CPU_NUM);
    int i = 0;
    for(i=0;i<THREAD_MAX_NUM;i++)
    {
        tid[i] = i;
        pthread_create(&thread[i],NULL,threadFun, &tid[i]);
    }
 
    for(i=0; i< THREAD_MAX_NUM; i++)
    {
        pthread_join(thread[i],NULL);
    }
 
    return 0;
}

3.2.2、pthread方式

#define _GNU_SOURCE            
#include <pthread.h>
 
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset)

参数:

pthead:线程对象

cpusetsize:mask参数所指定数的长度,通常设定为sizeof(cpu_set_t)。

mask:CPU掩码

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
 
#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>
#include<pthread.h>
 
#define THREAD_MAX_NUM 10  //1个CPU内的最多进程数
 
int CPU_NUM = 0;  //cpu中核数
int CPU = 3; // CPU编号
 
void* threadFun(void* arg)
{
    cpu_set_t affinity;   //获取在集合中的CPU
    CPU_ZERO(&affinity);
    pthread_t thread = pthread_self();
    // 获取当前进程的CPU Affinity
    if (pthread_getaffinity_np(thread, sizeof(affinity), &affinity) == -1)
    {
        printf("warning: cound not get Process affinity, continuing...\n");
    }
 
    int i = 0;
    for (i = 0; i < CPU_NUM; i++)
    {
        if (CPU_ISSET(i, &affinity))//判断线程与哪个CPU有亲和力
        {
            printf("this thread %d is running processor : %d\n", *((int*)arg), i);
        }
    }
 
    return NULL;
}
 
int main(int argc, char* argv[])
{
    int tid[THREAD_MAX_NUM];
    pthread_t thread[THREAD_MAX_NUM];
    // 获取核数
    CPU_NUM = sysconf(_SC_NPROCESSORS_CONF);
    printf("System has %i processor(s). \n", CPU_NUM);
    cpu_set_t mask;  //CPU核的集合
 
    CPU_ZERO(&mask);
    // set CPU MASK
    CPU_SET(CPU, &mask);
 
    int i = 0;
    for(i=0;i<THREAD_MAX_NUM;i++)
    {
        tid[i] = i;
        pthread_create(&thread[i],NULL,threadFun, &tid[i]);
        //设置当前进程的CPU Affinity
        if (pthread_setaffinity_np(thread[i], sizeof(mask), &mask) != 0)
        {
            printf("warning: could not set CPU affinity, continuing...\n");
        }
    }
 
    for(i=0; i< THREAD_MAX_NUM; i++)
    {
        pthread_join(thread[i],NULL);
    }
 
    return 0;
}

四、面临的挑战与解决方案

       

         在进行进程绑定优化时,可能会面临一些挑战,如如何准确判断进程的性质、如何实时监控系统负载等。为了解决这些问题,我们可以采用一些先进的监控工具和技术手段来辅助我们进行进程绑定优化。

注意事项:
1、在绑定cpu时需要注意自己是绑大核还是小核,是绑一个cpu还是多个cpu
2、在绑定多个进程时需要对各进程的资源使用情况及业务场景非常了解,否则不建议绑cpu操作

五、总结与展望

        进程绑定CPU核心是优化RK3399芯片性能的重要手段之一。通过深入了解芯片架构、采用合理的绑定策略以及不断尝试和优化,我们可以充分发挥RK3399芯片的性能优势。未来随着技术的不断发展,我们期待有更多的优化手段和技术出现,进一步提升RK3399芯片在多核处理领域的性能表现。

        以上就是我对于RK3399芯片如何优化进程绑定CPU核心的一些看法和实例分享。希望能对大家有所帮助。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: rk3399芯片代理提供的ddr用户测试工具_v1.38是一款专为rk3399芯片设计的用户测试工具。该工具主要用于测试和评估rk3399芯片的ddr内存性能。 v1.38版本的工具具有以下特点和功能: 1. 全面支持rk3399芯片:v1.38版本的工具专为rk3399芯片开发,可以充分发挥rk3399芯片的性能特点,为用户提供准确和可靠的测试数据。 2. DDR性能测试:该工具可以进行ddr内存的性能测试,包括读写速度、延迟、带宽等方面的测试。通过测试结果,用户可以了解rk3399芯片在不同工作状态下ddr内存的性能表现,并根据需要进行优化和调整。 3. 用户友好的界面:v1.38版本的工具采用直观清晰的用户界面,操作简单方便。用户可以通过工具提供的设置选项,自定义测试参数和测试模式,以满足不同测试需求。 4. 测试结果分析:工具还提供了详细的测试结果分析功能,用户可以查看测试结果的统计数据和图表,以了解ddr内存性能的分布和趋势。这有助于用户更好地理解rk3399芯片的性能特点,为产品开发优化提供指导。 总之,rk3399芯片代理提供的ddr用户测试工具_v1.38是一款功能强大、操作简便的工具,适用于对rk3399芯片的ddr内存性能测试和优化。通过该工具,用户可以充分发挥rk3399芯片的性能,提升产品的竞争力。 ### 回答2: rk3399芯片代理提供的DDR用户测试工具_v1.38是一款用于测试rk3399芯片的DDR(双数据率)性能的工具。 DDR是一种内存技术,可以在同一个时钟周期内读写两次数据,提内存的数据传输效率。rk3399芯片是一款性能的SoC(系统级芯片),适用于各种移动设备和嵌入式系统。 DDR用户测试工具_v1.38通过对rk3399芯片的DDR进行测试,可以评估其读写速度、稳定性和可靠性等性能指标。测试工具提供了一系列测试项和功能,例如读写延迟测试、读写带宽测试、读写稳定性测试等。 使用DDR用户测试工具_v1.38可以帮助开发人员和硬件工程师更好地了解rk3399芯片的DDR性能,并进行优化和调试。测试结果可以用于性能评估、系统调优和问题排查等工作。 在使用DDR用户测试工具_v1.38时,用户可以根据自己的需求选择不同的测试项和参数,进行测试和分析。测试工具提供了直观的界面和详细的测试报告,方便用户进行结果的查看和分析。 总之,rk3399芯片代理提供的DDR用户测试工具_v1.38是一款专为评估rk3399芯片的DDR性能而设计的工具,可以帮助开发人员和硬件工程师对rk3399芯片进行性能优化和问题排查。 ### 回答3: rk3399芯片代理提供的DDR用户测试工具_v1.38是一款用于测试rk3399芯片的DDR存储器性能的工具。该工具的主要功能包括: 1. 内存测试:可以对rk3399芯片中的DDR存储器进行全面的测试,包括读取、写入和随机访问等操作,以评估其读写速度和稳定性。 2. 参数设置:用户可以根据需要自定义各种测试参数,如测试模式、数据长度、地址范围等,以满足不同测试需求。 3. 测试报告生成:工具能够生成详细的测试报告,包括测试结果、错误记录和性能指标等,方便用户对DDR存储器的性能进行分析和评估。 4. 兼容性测试:该工具能够与不同版本的rk3399芯片兼容,可以在不同硬件平台上进行测试,确保测试结果的准确性和可靠性。 5. 调试功能:工具还提供了一些调试功能,如调试输出和调试接口,方便用户进行故障排除和性能优化。 综上所述,rk3399芯片代理提供的DDR用户测试工具_v1.38是一款功能强大、易于使用的工具,能够全面测试rk3399芯片的DDR存储器性能,为用户提供准确的测试结果和充分的性能评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值