当前位置:网站首页>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

线程使用剖析来确定用户程序的选定部分的周期数。使用收集的数据来确定一个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 轮廓线程准备时间。

原网站

版权声明
本文为[weixin_38498942]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_38498942/article/details/125656540