Arm 麒麟650上的OpenMP

Arm 麒麟650上的OpenMP,arm,openmp,Arm,Openmp,基本上,麒麟650 ARM核心是华为5c手机中的一款。我试图坐在C++代码直接在根电话我有。此代码正在执行霓虹灯指令并具有OpenMP并行化。当我在手机上执行OpenMP功能时,它会返回: Num Procs = 8 Num Threads = 1 Max Threads = 8 Num Devices = 0 Default Device = 0 Is Initial Device = 1 这些信息似乎连贯一致,因为麒麟650有8个核心。但是,在手机技术细节中也有规定,麒麟可以有4芯高达1.

基本上,麒麟650 ARM核心是华为5c手机中的一款。我试图坐在C++代码直接在根电话我有。此代码正在执行霓虹灯指令并具有OpenMP并行化。当我在手机上执行OpenMP功能时,它会返回:

Num Procs = 8
Num Threads = 1
Max Threads = 8
Num Devices = 0
Default Device = 0
Is Initial Device = 1
这些信息似乎连贯一致,因为麒麟650有8个核心。但是,在手机技术细节中也有规定,麒麟可以有4芯高达1.7GHz(省电芯)和4芯高达2GHz(性能芯)

据我所知,OpenMP是异步的,如何处理这些问题?在我的基准测试中,当我针对
OpenMP-2线程
OpenMP-4线程
测试
No-OpenMP
时,我看到了加速,但我的
OpenMP-8线程
结果是灾难性的


这些核心是否共享同一个时钟(我使用Hayai库中的
clock\u gettime
指令来测试所有东西)?在这类平台上使用OpenMP执行任务时,您有什么建议吗?

在更快的内核上运行的线程首先完成,然后等待较慢的线程完成,从而浪费资源。使用OpenMP编程这样一个系统并非不可能,但只有某些算法,特别是那些来自“控制器工作者”或“任务包”类型的算法,才会受益。另外,忘记
调度(静态)
,使用OpenMP 4的位置模型来正确固定线程。通过位置,您的意思是我应该设置OMP_位置环境变量吗?我从来没有用过它,读它代表的东西让我有点困惑。如果我理解得很好,每个核心都有自己的线程集,它们不能从一个核心移动到另一个核心,对吗?那么,我应该只导出OMP_PLACES=core吗?有了这些位置,我们可以以一种非常通用的方式将OpenMP运行时绑定到特定线程的位置。默认情况下,允许线程从一个核心迁移到另一个核心。但线程固定只有在算法能够将工作负载分配给不同速度的处理元素时才有用。@HristoIliev:也许你可以发表你的评论作为答案?@baptiste:Hristo的评论解决了你的问题吗?运行在更快内核上的线程先完成,然后等待较慢的线程完成,浪费资源。使用OpenMP编程这样一个系统并非不可能,但只有某些算法,特别是那些来自“控制器工作者”或“任务包”类型的算法,才会受益。另外,忘记
调度(静态)
,使用OpenMP 4的位置模型来正确固定线程。通过位置,您的意思是我应该设置OMP_位置环境变量吗?我从来没有用过它,读它代表的东西让我有点困惑。如果我理解得很好,每个核心都有自己的线程集,它们不能从一个核心移动到另一个核心,对吗?那么,我应该只导出OMP_PLACES=core吗?有了这些位置,我们可以以一种非常通用的方式将OpenMP运行时绑定到特定线程的位置。默认情况下,允许线程从一个核心迁移到另一个核心。但线程固定只有在算法能够将工作负载分配给不同速度的处理元素时才有用。@HristoIliev:也许你可以将你的评论作为答案发表?@baptiste:Hristo的评论解决了你的问题吗?