当前位置:网站首页>B_QuRT_User_Guide(37)
B_QuRT_User_Guide(37)
2022-07-07 21:52:00 【weixin_38498942】
B_QuRT_User_Guide(37)
- 23 Profiling
- 23.1 qurt_get_core_pcycles()
- 23.2 qurt_atomic_compare_and_set()
- 23.3 qurt_profile_enable2()
- 23.4 qurt_profile_get()
- 23.5 qurt_profile_get_idle_pcycles()
- 23.6 qurt_profile_get_thread_pcycles()
- 23.7 qurt_get_hthread_pcycles()
- 23.8 qurt_get_hthread_commits()
- 23.9 qurt_profile_get_threadid_pcycles()
- 23.10 qurt_profile_reset_idle_pcycles()
- 23.11 qurt_profile_reset_threadid_pcycles()
- 23.12 Data Types
- 23 Macros
23 Profiling
线程使用剖析来确定用户程序的选定部分的周期数。使用收集的数据来确定一个QuRT线程(或整个QuRT用户程序系统)的CPU利用率。
剖析支持运行(执行)和空闲(不执行)周期的特定线程循环计数。重置计数可以对用户程序的特定部分进行周期计数。
除了一个配置文件周期计数外,所有的周期计数都以处理器周期(所有硬件线程执行的实际处理器周期数)表示,而不是线程周期(例如,特定硬件线程执行的周期数)。假设有六个硬件线程,下面的等式表达了这两种周期类型之间的关系。
线程周期=处理器周期/6
启用剖析操作可选择性地启用或禁用剖析(默认情况下是禁用的)。
注意:重置周期计数必须在开始周期计数之前通过调用重置操作明确进行。
获取剖析线程ID处理器周期操作返回指定QuRT线程的当前每硬件线程运行周期计数(第3节)。该操作返回一个包含每个硬件线程当前运行周期计数的数组。每个计数值代表了相应硬件线程上已经过去的处理器周期数,而该线程已经被安排到指定的QuRT线程。
获取配置文件线程处理器周期操作返回指定QuRT线程的当前运行周期计数(第3节)。计数值代表所有硬件线程上已经过去的处理器周期数,同时该线程已被安排给指定的QuRT线程。
注意:该计数值相当于将获取配置文件线程ID处理器周期操作所返回的每个硬件线程周期计数值相加。
get profile thread cycles操作返回当前QuRT线程的当前运行周期计数,以线程周期为单位表示。
get profile idle processor cycles操作返回当前的空闲周期数(即,一个硬件线程处于IDLE状态且不执行任何指令的周期数)。该操作返回一个包含每个硬件线程的当前空闲周期数的数组。每个计数值代表了相应硬件线程在等待模式下已经过去的处理器周期数。
注意:在内核中执行的周期是根据当前线程过渡到内核时所处的状态(例如,空闲或运行)来划分为空闲或运行。
获取核心处理器周期操作返回自Hexagon处理器上次被重置以来执行的处理器周期数。该值基于硬件核心时钟,其速度根据处理器时钟频率而变化(与第16节中描述的系统时钟不同。
在一个给定的时间段内,该操作所经过的周期数与获取配置文件线程/空闲处理器周期操作(均在上文描述)所返回的值之间的关系用以下公式表示:
total_PCYCLES = run_pcycles + idle_pcycles
在这个公式中,获取核心处理器周期操作返回total_PCYCLES值。
run_pcycles和idle_pcycles是根据获取配置文件线程/空闲处理器周期操作返回的周期数值定义的:
for (<all QuRT threads>) for (i = 0; i < MAX_HW_THREADS; i++) run_pcycles += profile_thread_pcycles[i] / 6;
for (i = 0; i < MAX_HW_THREADS; i++)
idle_pcycles += profile_idle_pcycles[i] / 6;
循环计数是以每个线程为基础进行汇总的,因此上述代码必须将每个处理器循环计数转换成线程循环计数(通过除以6)。
注意:当Hexagon处理器关闭时,硬件核心时钟停止运行(由于其所有硬件线程处于空闲状态),将此操作返回的周期值视为相对值而非绝对值。
计算CPU利用率 - QuRT线程(或整个QuRT应用系统)的CPU利用率表明,在特定时间段内,Hexagon处理器执行的周期中有多少被特定线程(或应用系统)使用:
CPU_utilization = run_pcycles / total_PCYCLES
在这个等式中,run_pcycles是由获取配置文件线程处理器周期操作返回的周期计数值。
total_PCYCLES是由获取核心处理器周期操作(也在上面描述)返回的值。
Hexagon处理器可能在节能模式下度过了部分指定时间段,其中硬件核心时钟被完全关闭(因为所有硬件线程都是空闲的)。在这种情况下,total_PCYCLES中的值并不代表绝对时间。
为了准确计算这种情况下的CPU利用率,用核心时钟关闭时间调整total_PCYCLES。用以下公式计算QuRT系统时钟的关机时间(也叫ALL_WAIT期):
ALL_WAIT_pcycles = ((total_sclk_samples / QTIMER_clock_freq)*
core_clock_freq) - total_PCYCLES
在这个等式中,total_sclk_samples是QuRT系统时钟经过的周期数(第16节)。 total_PCYCLES是由get core processor cycles操作返回的值。QTIMER_clock_freq为
在所有目标系统上为19.2 MHz。
core_clock_freq是Hexagon处理器的核心时钟频率(具体到每个目标系统)。考虑到ALL_WAIT期间,调整后的CPU利用率为:
CPU_utilization = run_pcycles / (total_PCYCLES + ALL_WAIT_pcycles)
注意:ALL_WAIT_pcycles方程假定Hexagon处理器核心时钟频率在分析的时间间隔内不发生变化。如果时钟频率在这个时间间隔内确实发生了变化,则必须对输入值进行修正,因为每个样本的权重是不同的。
23.1 qurt_get_core_pcycles()
23.1.1 功能文档
23.1.1.1 unsigned long long int qurt_get_core_pcycles ( void )
获取所执行的核心处理器周期的计数。
返回自Hexagon处理器上次复位以来执行的运行处理器周期的当前数量。
该值基于硬件核心时钟,其速度根据处理器的时钟频率而变化。
将原子变量减一。
注意:由于处理器关闭时硬件核心时钟停止运行(由于所有的硬件线程都处于空闲状态),请将此操作返回的周期值视为相对值而非绝对值。
线程周期数仅在V4 Hexagon处理器版本中有效。
返回值
Integer – Current count of core processor cycles.
依赖项
None.
23.2 qurt_atomic_compare_and_set()
23.2 功能文档
23.2.1.1 void qurt_profile_enable ( int enable )
启用剖析功能。
启用或禁用运行和空闲处理器周期的循环计数。默认情况下,剖析功能是禁用的。
注意:启用剖析并不自动重置周期计数 - 这必须在开始周期计数之前通过调用重置操作明确地完成。
参数
返回值
None.
依赖项
None.
23.3 qurt_profile_enable2()
23.3.1 功能文档
23.3.1.1 int qurt_profile_enable2 ( qurt_profile_param_t param, qurt_thread_t thread_id, int enable )
开始对特定线程上的特定参数进行分析(如适用)。
** 参数**
返回值
QURT_EOK – Success
QURT_EALREADY – Measurement already in progress or already stopped QURT_ENOTHREAD – Thread does not exist
QURT_EINVALID – Invalid profiling parameter
依赖项
None.
23.4 qurt_profile_get()
23.4.1 功能文档
23.4.1.1 int qurt_profile_get ( qurt_profile_param_t param, qurt_thread_t thread_id, qurt_profile_result_t ∗ result )
获取之前启用的剖析参数的值。
参数
返回值
QURT_EOK – Success
QURT_EFAILED – Operation failed; profiling was not enabled QURT_ENOTHREAD – Thread does not exist QURT_EINVALID – Invalid profiling parameter
依赖项
None.
23.5 qurt_profile_get_idle_pcycles()
23.5.1 功能文档
23.5.1.1 void qurt_profile_get_idle_pcycles ( unsigned long long ∗ pcycles )
获取闲置处理器周期的计数。
返回所有硬件线程的当前空闲处理器周期计数。
该操作接受一个指向用户定义的数组的指针,并将每个硬件线程的当前空闲周期计数写入该数组中。
每个计数值代表了相应硬件线程在等待模式下所经过的处理器周期数。
注意:该操作不返回Hexagon处理器关闭时发生的空闲周期(由于所有的硬件线程都处于空闲状态)。
带掩码的 64 位原子变量的按位与运算。
参数
返回值
None.。
依赖项
None.
23.6 qurt_profile_get_thread_pcycles()
23.6.1 功能文档
23.6.1.1 unsigned long long int qurt_profile_get_thread_pcycles
获取当前线程正在运行的处理器周期的计数。
返回当前QuRT线程正在运行的处理器周期数。
返回值
Integer – Running processor cycle count for current thread.
依赖项
None.
23.7 qurt_get_hthread_pcycles()
23.7.1 功能文档
23.7.1.1 unsigned int qurt_get_hthread_pcycles ( int n )
读取GCYCLE_nT寄存器,以便在N个线程处于运行模式时测量性能。
注意:当架构早于v67时返回0。
参数
返回值
Value read from GCYCLE_nT register.
依赖项
PMU must be enabled.
23.8 qurt_get_hthread_commits()
23.8.1 功能文档
23.8.1.1 unsigned int qurt_get_hthread_commits ( int n )
读取GCOMMIT_nT寄存器,以便在N个线程处于运行模式时进行性能测量。
注意:当架构早于v67时返回0。
参数
返回值
Value read from the GCOMMIT_nT register.
依赖项
PMU must be enabled.
23.9 qurt_profile_get_threadid_pcycles()
23.9.1 功能文档
23.9.1.1 void qurt_profile_get_threadid_pcycles ( int thread_id, unsigned long long ∗ pcycles )
获取指定QuRT线程的运行处理器周期计数。
返回指定QuRT线程的当前每个硬件线程的运行周期计数。
每个计数值代表在相应的硬件线程上已经过去的处理器周期数,而该线程已经被安排给指定的QuRT线程。
参数
返回值
None.
依赖项
None.
23.10 qurt_profile_reset_idle_pcycles()
23.10.1 功能文档
23.10.1.1 void qurt_profile_reset_idle_pcycles ( void
将每个硬件线程的空闲周期计数设为零。
返回值
None.
依赖项
None.
23.11 qurt_profile_reset_threadid_pcycles()
23.11.1 功能文档
23.11.1.1 void qurt_profile_reset_threadid_pcycles ( int thread_id )
将指定的QuRT线程的每个硬件线程运行周期计数设置为零。
参数
返回值
None.
依赖项
None.
23.12 Data Types
本节描述了剖析服务的数据类型。
23.12.1 Data Structure Documentation
23.12.1.1 union qurt_profile_result_t
剖析结果。
23.12.1.2 struct qurt_profile_result_t.thread_ready_time
与QURT_PROFILE_PARAM_THREAD_READY_TIME相关的结果。
23 Macros
本节介绍了用于剖析服务的宏。
23.13 Define Documentation
23.13.1 功能文档
23.13.1.1 static QURT_INLINE unsigned long long qurt_atomic64_sub_return (unsigned long long ∗ target, unsigned long long v )
禁用剖析。
23.13.1.2 #define QURT_PROFILE_ENABLE 1
禁用剖析。
23.13.2 Enumeration Type Documentation
23.13.2.1 enum qurt_profile_param_t
枚举器:
QURT_PROFILE_PARAM_THREAD_READY_TIME 轮廓线程准备时间。
边栏推荐
- 1. Sum of two numbers
- The text editor of markdown class should add colors to fonts (including typora, CSDN, etc.)
- 云原生正在吞噬一切,开发者该如何应对?
- Freelink open source call center design idea
- Opencv scalar passes in three parameters, which can only be displayed in black, white and gray. Solve the problem
- Kubernetes' simplified data storage storageclass (creation, deletion and initial use)
- Install a new version of idea. Double click it to open it
- FPGA基础篇目录
- In the field of software engineering, we have been doing scientific research for ten years!
- Matlab 信号处理【问答随笔·2】
猜你喜欢
成年人只有一份主业是要付出代价的,被人事劝退后,我哭了一整晚
UE4_UE5蓝图command节点的使用(开启关闭屏幕响应-log-发布全屏显示)
PCI-Express接口的PCB布线规则
When copying something from the USB flash disk, an error volume error is reported. Please run CHKDSK
Wechat forum exchange applet system graduation design (3) background function
js 获取对象的key和value
Mysql索引优化实战一
LDO穩壓芯片-內部框圖及選型參數
Solve the problem of duplicate request resource paths /o2o/shopadmin/o2o/shopadmin/getproductbyid
城联优品作为新力量初注入,相关上市公司股价应声上涨150%
随机推荐
二叉树(Binary Tree)
Adults have only one main job, but they have to pay a price. I was persuaded to step back by personnel, and I cried all night
Oracle database backup and recovery
Ros2 topic (03): the difference between ros1 and ros2 [02]
LeeCode -- 6. Z 字形变换
LeeCode -- 6. Zigzag transformation
Network security -burpsuit
V-for traversal object
Spark 离线开发框架设计与实现
系统架构设计师备考经验分享:论文出题方向
Dynamics 365 查找字段过滤
经纬度PLT文件格式说明
In the field of software engineering, we have been doing scientific research for ten years!
位运算(Bit Operation)
leetcode-520. 检测大写字母-js
648. 单词替换
Oracle-数据库的备份与恢复
Unity3d Learning Notes 6 - GPU instantiation (1)
Adrnoid开发系列(二十五):使用AlertDialog创建各种类型的对话框
海内外技术人们“看”音视频技术的未来