天天看点

功率优化SDK介绍( 三)4 用Snapdragon™功率优化SDK编程

Qualcomm® Snapdragon™功率优化SDK介绍(三)

  • 4 用Snapdragon™功率优化SDK编程
    • 4.1 使用 ndk-build 构建功率优化 SDK 应用程序

4 用Snapdragon™功率优化SDK编程

本节将了解一个使用 Snapdragon™ 功率优化 SDK 的简单原生应用程序。

1 #include <random>
2 #include <vector>
3 #include <qspower/power.hh>
4
5 // Perform a vector addition reducing the power consumption
6 // by using the static window power mode
7 int main()
8 {
9 const size_t N = 100;
10 std::vector<float> a(N), b(N), c(N);
11 std::random_device random_device;
12 std::mt19937 generator(random_device());
13 const float min_value = -1024.0, max_value = 1024.0;
14 std::uniform_real_distribution<float> dist(min_value, max_value);
15
16 const float alpha = 0.2f; // multiplicative factor
17
18 qspower::init();
19
20 // request window mode of 40% to 50% frequency on cpu big cores for an indefinite period of time
21 qspower::request_mode(qspower::mode::window(40, 50),
qspower::device_set{ qspower::device_type::cpu_big });
22
23 // Initialize the source arrays with random numbers
24 for (size_t i = 0; i < N; i++)
25 {
26 a[i] = dist(generator);
27 b[i] = dist(generator);
28 }
29
30 // computation, vector addition
31 for (size_t i = 0; i < N; i++)
32 {
33 c[i] = alpha * a[i] + b[i];
34 }
35
36 // return the system to the normal power state
37 qspower::request_mode(qspower::mode::normal);
38
39 qspower::terminate();
40
41 return 0;
42 }
           

在高层次上,上面的应用程序做了两个 N 元素向量的向量加法。 这个想法是使用 Power Optimization SDK 来控制矢量相加过程中 CPU 大核的频率。 这使开发人员能够在运行时控制每个内核的运行频率,这有助于减少应用程序的性能下降。 本示例中仅选择 CPU_BIG 作为示例设备。其他设备(例如 CPU_LITTLE 和 GPU)也可以作为传递给 Power Optimization SDK 的 device_set 的一部分。

必须调用的第一个 API 是 qspower_init()。 此 API 初始化 Power SDK 内部。在执行向量操作之前,会调用 Power Optimization SDK 以特定频率操作内核。 第 24 行要求将 CPU_BIG 内核的频率级别保持在 CPU_BIG 内核可以支持的最大可用频率级别数的 40%-50% 范围内。

第 27-37 行添加了两个 N 元素向量 a 和 b,它们的总和存储在向量 c 中。

向量添加完成后,第 40 行在 CPU_BIG 内核上恢复正常功耗模式。 第 42 行调用终止 API 来清理 Power Optimization SDK 内部。 一旦不再需要功率优化 SDK,最好在您的应用程序中调用 qspower_terminate。

此示例应用程序作为安装包的一部分分发,可以在 $QSPOWER_DIR/samples 中找到。

4.1 使用 ndk-build 构建功率优化 SDK 应用程序

上述使用Power Optimization SDK的向量加法程序可以使用ndk-build构建。 以下是项目的jni/Application.mk文件。

1 APP_PLATFORM := android-19
2 APP_ABI := armeabi-v7a arm64-v8a
3 NDK_TOOLCHAIN_VERSION := clang
4 APP_STL := c++_static
           

下面所示的JNI / Android.mk生成可执行,power_static,即链接到预建的功耗优化SDK库。 注意此文件建立的所有功耗优化SDK的样本,所以有后power_static产生更多的可执行文件。

1 # Copyright (c) 2017 Qualcomm Technologies, Inc.
2 # Qualcomm® Snapdragon™ Power Optimization SDK Examples
3
4 # This is the folder containing Android.mk
5 LOCAL_PATH := $(call my-dir)
6
7 # Power Optimization SDK version
8 QSPOWER_VERSION = 1.4
9
10 # paths (can be overridden on the cmd line)
11 QSPOWER_SAMPLES_SRC_PATH := $(LOCAL_PATH)/../../../src
12 QSPOWER_CORE_INCLUDE_PATH := $(LOCAL_PATH)/../../../../include
13 QSPOWER_CORE_LIB_PATH := $(LOCAL_PATH)/../../../../lib
14
15 ###############################################################################
16 # Power Optimization SDK prebuilt
17 include $(CLEAR_VARS)
18
19 LOCAL_MODULE := qspower
20 LOCAL_SRC_FILES := $(QSPOWER_CORE_LIB_PATH)/$(TARGET_ARCH_ABI)/libqspower-$(QSPOWER_VERSION).so
21 LOCAL_EXPORT_C_INCLUDES := $(QSPOWER_CORE_INCLUDE_PATH)
22
23 include $(PREBUILT_SHARED_LIBRARY)
24
25 ###############################################################################
26
27 # Power Optimization SDK C API Samples - power_static_c
28 include $(CLEAR_VARS)
29
30 LOCAL_MODULE := power_static_c
31 LOCAL_SRC_FILES := $(QSPOWER_SAMPLES_SRC_PATH)/power_static_c.cc
32 LOCAL_SHARED_LIBRARIES := qspower
33 LOCAL_CPPFLAGS := -pthread -std=c++11
34 LOCAL_LDLIBS := -llog
35
36 include $(BUILD_EXECUTABLE)
37
38 ###############################################################################
39
40 # Power Optimization SDK C++ API Samples - power_static
41 include $(CLEAR_VARS)
42
43 LOCAL_MODULE := power_static
44 LOCAL_SRC_FILES := $(QSPOWER_SAMPLES_SRC_PATH)/power_static.cc
45 LOCAL_SHARED_LIBRARIES := qspower
46 LOCAL_CPPFLAGS := -pthread -std=c++11
47 LOCAL_LDLIBS := -llog
48
49 include $(BUILD_EXECUTABLE)
50
51 ###############################################################################
52
53 # Power Optimization SDK C++ API Samples - power_dynamic
54 include $(CLEAR_VARS)
55
56 LOCAL_MODULE := power_dynamic
57 LOCAL_SRC_FILES := $(QSPOWER_SAMPLES_SRC_PATH)/power_dynamic.cc
58 LOCAL_SHARED_LIBRARIES := qspower
59 LOCAL_CPPFLAGS := -pthread -std=c++11
60 LOCAL_LDLIBS := -llog
61
62 include $(BUILD_EXECUTABLE)
63
64 ###############################################################################