1. 程式人生 > >Qualcomm Heterogeneous Compute SDK(1)

Qualcomm Heterogeneous Compute SDK(1)

1.What is Qualcomm Heterogeneous Compute SDK?

    Qualcomm Heterogeneous Compute SDK 是高通開發者工具集中用於開發階段的重要工具,它可以幫助開發者更好地利用 高通平臺硬體的效能,提升應用的效率。它和應用程式及硬體之間的關係如下圖所示,其中包括了Affinity、Pattern、Task 和 Buffer 四大部分。

    通俗地說,它就是一系列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 型別。

    你可以從一個 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 核心,如下圖所示。

    你可以通過獨立的函式或諸如 Task、CPU Kernel 這些抽象來使用這些 API,如下圖所示。

    通過這些 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 中的模式能夠幫助開發者簡化並行程式設計,它與應用程式和硬體之間的關係如下圖所示。

    其中包含通用的並行 CPU 程式設計結構如資料並行、多分支遞迴(分治法)以及管道計算;如果需要進一步優化程式的並行執行你還可以 使用模式調優器。在 Beta 版本中有些模式甚至能夠在 CPU、GPU 和 DSP 間執行。

    Qualcomm Heterogeneous Compute SDK 中的模式抽象出了一些常見的演算法結構並將其並行化,如下圖所示。

    Qualcomm Heterogeneous Compute SDK 還提供了模式調優 API,你可以使用這些 API 定製並行演算法的執行以達到更好的優化效果。如下圖所示。

    下面的示例程式碼展示瞭如何使用 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) 中對任務管理及緩衝區管理進行更詳細的討論。