gpt4 book ai didi

android - 如何改善 OpenMP 在 Android 上的糟糕表现?

转载 作者:太空宇宙 更新时间:2023-11-03 11:03:04 25 4
gpt4 key购买 nike

我用一些用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com