- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我用一些用 JNI 封装的 C++ 代码为 android ( https://play.google.com/store/apps/details?id=cv.cvExperiments ) 编写了一个图像处理应用程序。为了在多核处理器上获得一些加速,我用 openmp“parallel for”指令注释了昂贵的循环。
问题是,在 x86 上,我在 4 核 proc 上获得了从 x3 到 x5 的一些加速,但在 Android 上,激活 OpenMP(使用 -fopenmp)不会在 ARM 32 位上提供任何加速,甚至会减慢 ARM 上的代码一个 64 位 armv8 金鱼草 810。
我错过了什么吗?有没有人能在 android+arm 上观察到与 x86 cpus 相当的加速?
互联网上有很多关于如何激活 OpenMP 的教程,但没有显示加速的基准。有什么指点吗?
我找到的唯一相关信息是 armv8 上 OpenMP 开销的基准测试,他们还注意到一些相当高的开销: https://wiki.linaro.org/WorkingGroups/Middleware/Graphics/GPGPU/Docs/OpenMPforARMv8PortAnalysis
谢谢,马修
最佳答案
Android 上的多线程问题很可能与许多 CPU 的架构有关。骁龙 810 是 low/high architecture , 有 4 个强核和 4 个弱核。
Specifically, the 810 employs four Cortex-A57 and four Cortex-A53 cores in a big.LITTLE heterogeneous configuration, where all eight cores are available to the OS scheduler.
如果没有良好的工作池实现,为平衡工作负载而产生的所有额外线程最终可能会进入低性能内核,根据我的估计,在繁重的 SIMD 计算上,这些内核的速度大约是强大内核的三倍(在三星 Exynos 9611)。
缓解需要使用线程亲和性来仅在强大的核心上创建额外的工作人员,或者每个工作负载需要专门针对每个核心的能力进行定制;这里 16 个 block 的工作被分成 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 个 block ,平均每个快速核心将执行 3 个 block ,每个慢速核心将执行 1 个 block 。)
关于android - 如何改善 OpenMP 在 Android 上的糟糕表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37985137/
我有一个 recycleView Activity ,这是我应该在设计中展示的内容 我用这段代码来展示它 val arr:ArrayList = arrayListOf("English","
我目前正在运行 Ubuntu 12.04LTS,nginx 发出请求。 我通过谷歌页面速度( https://developers.google.com/speed/pagespeed/insight
我有以下字符串作为键。从下面的代码中,我看到所有的键都指向同一个 reducer ,尽管有很多 reducer 。最后,同一个 reducer 重载。我想,每个键(字符串),去一个不同的 reduce
假设我有一个 flexbox,为了举例,每个元素都包含一个图像。在这种情况下,flexbox 的目的是将它们均匀分布。 看起来很简单。让我们试试吧。 #flex { width: 350px;
我正在从事基于视频车牌检测的项目。 它是这样的: 当我想在车牌上使用 OCR 时,我的问题就出现了。我在一些图片上对其进行了测试,效果非常好。这是一些例子: 但是当我把检测到的盘子放上去时,结果很糟糕
所以我有下面这组代码解析好吃的信息。它以下列格式从 Delicious 页面打印数据 书签 |人数 书签 |人数等等…… 我曾经使用以下方法来查找此信息。 def extract (soup):
我想为组特征(std、mean...)添加一些列,下面的代码有效,但数据集真的很大而且性能很差。有改进代码的好主意吗?谢谢 import pandas as pd df = pd.DataFrame(
我正在使用 new relic 来诊断和修复我们数据库的性能问题。所以我有以下最耗时的查询。 SELECT * FROM `page_view` WHERE `ip_address` = ?s A
我的公司使用 UIWebView 来展示广告。我遇到的问题是初始化 UIWebView 似乎很昂贵;使用 Time Profiler 进行的分析显示 [UIWebView alloc] initWit
如何让下面的代码更优雅?目前我必须手动添加每个条件。有没有一种方法可以检查 $total_points 的值是否位于数组 $ranking_list 的连续项之间? function ym_rank(
g++ 有时会产生相当复杂的输出。特别是在处理模板时。是否有任何工具可以使 g++ 输出更具可读性? ...至少有一些颜色? 在这里问这个问题可能听起来很傻,但我无法通过谷歌搜索。 最佳答案 从 4.
我有一个 API,它登录一个帐户,然后对我想通过 CFHTTP 请求出价的项目执行搜索,如下所示。 搜索.cfm: 登录.cfm:
我有一个包含超过一百万条记录的表,其结构如下: mysql> SELECT * FROM Measurement; +----------------+---------+--------------
使用 trainCascade 训练类似 HAAR 的特征。向社区寻求建议以获得更好的结果。一般来说,什么被认为是好的接受率? 我从一个较小的培训开始,遵循此链接作为指南:http://coding-
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我们从 JBoss 4(和 JDK 5)升级到 JBoss 5(和 JDK 6)。问题是开始时间已经从 1.5 分钟(在 JBoss 4 上)变为超过 4 分钟。 18:53:35,444 INFO
这是 a previous question on improving rails console loading time 的后续内容。 . 第一个很好的建议是找出 which gems take
我想知道以下哪一项会为加载大量 javascript(jQuery + jQuery UI + 各种其他 javascript 文件)的页面带来更好的性能。我已经浏览了大部分 YSlow 和 Goog
我正在使用多个 setInterval() 例如创建、移动、删除落在屏幕上的字符串 问题是 MODE 1 间隔导致 interval1 出现滞后 我也尝试过切换到MODE 2 STUFF,但仍然出现延
我是一名优秀的程序员,十分优秀!