Qualcomm Heterogeneous Compute SDK(1)

1.What is Qualcomm Heterogeneous Compute SDK?

    Qualcomm Heterogeneous Compute SDK 是高通开发者工具集中用于开发阶段的重要工具,它可以帮助开发者更好地
利用高通平台硬件的性能,提升应用的效率。它和应用程序及硬件之间的关系如下图所示,其中包括了Affinity、Pattern、
Task 和 Buffer 四大部分。

Qualcomm Heterogeneous Compute SDK(1)

    通俗地说,它就是一系列API,用来:

        管理任务在 CPU、GPU 以及 DSP 之间的执行

        高效地在不同计算核心之间管理数据

        提供针对底层系统调用和数据管理的抽象

        兼容 C++11、OpenCL、OpenGL、Hexagon SDK(DSP)

    下面我们将详细讲解的四部分。其中本问将介绍如何使用亲密度 API 来控制算法在不同核心上的执行以及如何使用
模式来优化并行编程。在 Qualcomm Heterogeneous Compute SDK(2) 中我们将继续介绍如何使用任务管理 API 创建
独立的工作单元以使其在 CPU、GPU、DSP 间异步执行。

2.Kernel

    Kernel 是实际的工作单元,也是对你的代码的封装。下图展示了 CPU、GPU 以及 DSP 上的 Kernel 类型。

Qualcomm Heterogeneous Compute SDK(1)

    你可以从一个 C++ 算符或函数指针创建一个 CPU Kernel,并且可以为该 CPU Kernel 设置 CPU Affinity;你可以
从 OpenCL 或OpenGL 创建一个 GPU Kernel;你也可以从使用 Hexagon SDK 创建一个 DSP Kernel。

    下面的示例代码展示了如何创建一个 CPU Kernel。

    void vector_double(std::vector<int> & x,
                std::vector<int> & y)
    {
        for (size_t i = 0; i < x.size(); i++)
        {
            y[i] = x[i] * 2;
        }
    }

    auto ck = hetcompute::create_cpu_kernel(vector_double);

2.Affinity

    CPU Affinity 是控制代码具体在哪个 CPU 核心上执行的机制。Qualcomm Heterogeneous Compute SDK 中包含一
系列管理 CPU Affinity的 API。你可以在你的应用程序中使用这些 API 灵活控制运行你的代码的 CPU 核心,如下图所示。

Qualcomm Heterogeneous Compute SDK(1)

    你可以通过独立的函数或诸如 Task、CPU Kernel 这些抽象来使用这些 API,如下图所示。

Qualcomm Heterogeneous Compute SDK(1)

    通过这些 API 你可以控制你的程序在指定的 CPU 上运行;决定线程是否能自由地在不同 CPU 核间迁移;以及覆盖或
附加本地的亲密度设置。

    下面的代码展示了如何控制一个 CPU Kernel 的 Affinity 设置。

    void vector_double(std::vector<int> & x,
                std::vector<int> & y)
    {
        for (size_t i = 0; i < x.size(); i++)
        {
            y[i] = x[i] * 2;
        }
    }

    auto ck = hetcompute::create_cpu_kernel(vector_double);
    ck.set_big();

    通过设置 CPU Affinity,你可以灵活控制硬件性能,如在需要大量计算的场合下将负载放到大核上以提高效率,当负载
较小时可以关闭大核,将任务放到小核上运行以降低功耗。

3.Patterns

    Qualcomm Heterogeneous Compute SDK 中的模式能够帮助开发者简化并行编程,它与应用程序和硬件之间的关系如下图所示。

Qualcomm Heterogeneous Compute SDK(1)

    其中包含通用的并行 CPU 编程结构如数据并行、多分支递归(分治法)以及管道计算;如果需要进一步优化程序的并行
执行,你还可以使用模式调优器。在 Beta 版本中有些模式甚至能够在 CPU、GPU 和 DSP 间执行。

    Qualcomm Heterogeneous Compute SDK 中的模式抽象出了一些常见的算法结构并将其并行化,如下图所示。

Qualcomm Heterogeneous Compute SDK(1)

    Qualcomm Heterogeneous Compute SDK 还提供了模式调优 API,你可以使用这些 API 定制并行算法的执行以达到更好的优化效果。如下图所示。

Qualcomm Heterogeneous Compute SDK(1)

    下面的示例代码展示了如何使用 Qualcomm Heterogeneous Compute SDK 中的模式来简化并行编程。

    void vector_double(std::vector<int> & x,
                std::vector<int> & y)
    {
        hetcompute::pfor_each(size_t(0), y.size(), [&](size_t i)) {
            y[i] = x[i] * 2;
        }
    }

    Qualcomm Heterogeneous Compute SDK 提供的模式及相关 API 极大简化了并行程序的编写,帮助开发者更快地开发
出更高效的应用程序并充分发挥高通平台硬件的性能。

    我们将在 Qualcomm Heterogeneous Compute SDK(2) 中对任务管理及缓冲区管理进行更详细的讨论。