天天看点

Heterogeneous Compute SDK Affinity

一、Affinity API

1)、Affinity API能够让程序员轻松地更改程序属性(任意函数),HetCompute任务和设备线程。

  (1)、Location: 设置CPU运行的构造程序。

  (2)、Pinning: 设置HetCompute设备线程是否应该在核心之间自由迁移(也称为线程绑定)。

  (3)、Mode: 覆盖本地关联设置。

2)、程序API被定义在: hetcompute/affinity.hh。这些API能够提升程序性能和节能。

NOTE: 为了设置独立的任务(而不是使用上述API的所有任务)affinity到big或者LITTLE在一个big.LITTLE.SoC,请使用CPU内核属性(去设置内核属性)。

3)、关于API的功能,在heterogeneous的SOC中定位是能目标集群,例如Qualcomm 845或者835。每种型号都会提供不同的性能和功率。例如,在Snapdragon 845中,程序员可以选择仅在LITTLE集群中运行,如以下示例所示:

      

Heterogeneous Compute SDK Affinity

4)、上述例子说明了三种不同的设置affinity的方法,并说明了如何覆盖其他方法。

  (1)、hetcompute::affinity::execute是对函数调用,函数对象或C ++ lambdas可表达的程序语句强制执行affinity最简单,最便携和有效的方法。在示例中,我们使用参数42调用fn函数,并且确保HetCompute函数在大核上运行。注: 无论调用hetcompute::affinity::execute的线程是否在大核还是小核运行,编程者无须担心代码是否在big.LITTLE的SOC上执行。HetCompute会决定以最佳方式执行affinity函数。

  (2)、编程者能够设置一个独立的affinity内核。在这个例子中,这个HetCompute CPU内核k_with_attrib语句被标记作为affinity为了这个LITTLE核(k_with_attrib.set_little())。HetCompute将运行这个CPU内核k_with_attrib在一个LITTLE核,相比之下k_wout_attrib会运行在任意核。

  (3)、通过如下API,可以设置程序中所有affinity的状态: hetcompute::affinity::set(hetcompute::affinity::settings(hetcompute::affinity::cores::little,false, hetcompute::affinity::mode::allow_local_setting))。

  (4)、上面的语句创建了一个affinity设置目标,包含指定的location, pinning和mode。调用hetcompute::affinity::set将更新这个HetCompute affinity设置。在这个例子中,HetCompute设备线程将仅仅运行在LITTLE CPUS和能够自由迁移的CPUs。这个设置对于挽救功耗是非常有用的,因为他可以让所有的CPU任务执行在一个低功耗的SoC集群上。从没有big/LITTLE属性的CPU内核构造的任务将通过关联设置自动路由到适当的CPU核心(示例中为LITTLE核心)。

  (5)、NOTE: 在具有同类内核的SoC中指定big或者LITTLE的位置(例如Snapdragon 805)将不起作用。 但是,仍将满足pinning请求。

5)、如果要更新相关联的程序中各个层面的设置,请参考如下API:

      

Heterogeneous Compute SDK Affinity

二、重载本地Affinity设置

1)、在某些情况下,工程师希望将设备线程固定到大核心,以便最大限度地位次和性能;例如,高度优化的线性代数库。他们可以通过将位置设置为big并固定为true来实现此目标。 保证所有任务都在大的运行;例如big/LITTLE CPU内核Affinity属性或者hetcompute::affinity::execute()的Affinity设置被关联。他们也可以将模式设置为override_local_settings。

      

Heterogeneous Compute SDK Affinity

  (1)、在上边的例子中,k_with_attrib内核前两次在LITTLE核心中运行,第三次在大核中运行。

  (2)、关于本地Affinity设置,设置模式为hetcompute::affinity::mode::allow_local_setting。

  (3)、NOTE: 很少有情况适合pinning;由于一些mobile包的thermally受到环境限制,CPU可以在未先通知的情况下进入在线和离线操作。当有pinning请求的时候,如果有离线CPU,HetCompute会尽可能将设备线程固定到单个CPU; 但是,某些设备线程可能会保持未固定状态。

2)、当状态不是经常被用到的时候,我们需要reset Affinity设置: hetcompute::affinity::reset()

3)、系统将返回默认状态,设备线程可以在CPU上自由移动

4)、所有以前的自由函数都是线程安全的,程序员可以在任何执行点调用关联API,甚至在CPU任务中也是如此。

继续阅读