如何改善 OpenMP 在 Android 上的较差性能?

2023-12-22

我为Android编写了一个图像处理应用程序(https://play.google.com/store/apps/details?id=cv.cvExperiments https://play.google.com/store/apps/details?id=cv.cvExperiments)以及一些用 JNI 包装的 C++ 代码。为了在多核处理器上获得一些加速,我用 openmp“parallel for”指令注释了昂贵的循环。

问题是,在 x86 上,我在 4 核处理器上获得了从 x3 到 x5 的一些加速,但在 Android 上,激活 OpenMP(使用 -fopenmp)不会在 ARM 32 位上提供任何加速,甚至会减慢 64 位 armv8 上的代码骁龙810。

我错过了什么 ?有人能观察到 android+arm 上的加速速度可与 x86 cpu 相媲美吗?

互联网上有很多关于如何激活 OpenMP 的教程,但没有显示加速情况的基准测试。有什么指示吗?

我发现的唯一相关信息是 armv8 上 OpenMP 开销的基准,他们还注意到一些相当高的开销:https://wiki.linaro.org/WorkingGroups/Middleware/Graphics/GPGPU/Docs/OpenMPforARMv8PortAnalysis https://wiki.linaro.org/WorkingGroups/Middleware/Graphics/GPGPU/Docs/OpenMPforARMv8PortAnalysis

谢谢, 马蒂厄


Android 上的多线程问题很可能与许多 CPU 的架构有关。骁龙 810 是一款低/高架构 https://www.tomshardware.com/reviews/snapdragon-810-benchmarks,4053-2.html,有 4 个强核心和 4 个弱核心。

具体来说,810 在 big.LITTLE 异构配置中采用了四个 Cortex-A57 和四个 Cortex-A53 内核,其中所有八个内核都可供操作系统调度程序使用。

如果没有良好的工作池实现,为平衡工作负载而生成的所有额外线程最终可能会变成低性能核心,根据我的估计,在繁重的 SIMD 计算上,这些核心的速度大约是强核心的三倍(在 Samsung Exynos 9611 上测量) )。

缓解需要使用线程亲和性仅在强核心上创建额外的工作线程,或者需要根据每个核心的功能专门定制每个工作负载;这里,16 个块的工作被分为 8 个核心,即 3+3+3+3+1+1+1+1(快速核心的 CPU id 为 4..7)。

#pragma omp parallel num_threads(8)
{
   auto tid = omp_get_thread_num();
   uint8_t aff[sizeof(cpu_set_t)] = { 0x80 >> tid };
   sched_setaffinity(0, 1, (cpu_set_t *)aff);

   if (tid < 4) do_task(tid * 3, tid * 3 + 3);
   else do_task(tid+8, tid+9);
}

借助 OMP,使用这种方法将原本需要 110 毫秒的任务减少到 30 毫秒,并将工作交付给 4 个更好的内核,时间减少到约 37 毫秒。

在连续工作负载(例如实时信号处理)上,将工作拆分为两倍数量的核心似乎允许 Linux 调度程序了解计算要求并将线程迁移到不同的核心,但这并不是万无一失的。 (8 个核心等于 16 个块,平均每个快速核心将执行 3 个块,每个慢速核心将执行 1 个块。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何改善 OpenMP 在 Android 上的较差性能? 的相关文章

  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 重载<<的返回值

    include
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐