我在共享的安卓库中使用OpenMP。有一个示例方法,它只检查CPU数量和最大线程数。
int maxThreads = omp_get_max_threads();
int numProcs = omp_get_num_procs();当我从一个基本的安卓应用程序(AppCompatActivity)中调用这个方法时,这两个值都会在高通855 CPU (8个核心)的设备上设置为8。
maxThreads = 8;
numProc = 8;当我试图从一个统一应用程序调用此方法时,返回的最大线程数和procs数为2。
maxThreads = 2;
numProc = 2;为什么联合应用程序中的最大线程数小于基本应用程序中的最大线程数?是否有办法增加实际使用的并行线程的数量?
发布于 2021-08-12 08:02:03
您没有说您使用的是哪个OpenMP实现,这肯定会很有用。
但是,假设Android在这个级别上的行为类似于Linux,那么可能会发生的是,联合正在设置进程的亲和力掩码(参见sched_{get,set}affinity(...),它反映了进程应该使用的logicalCPU)。OpenMP运行时几乎肯定会参考这一点,以确定创建线程的数量。
在Linux上,进程可以将线程关联到logicalCPU,该线程位于传入的亲和性掩码之外,但这肯定是不好的行为,可能导致性能较差,因为从根本上说,您的进程处于堆的底部,应该接受上级调度程序所要求的操作。
要确保您可以编写一个函数来打印关联掩码,那么您就可以看到正在发生的事情。或者,OpenMP实现可能有一个可预见的,这将使它告诉您它正在做什么。(例如,如果使用Intel或LLVM运行时,请尝试使用KMP_AFFINITY=verbose。)
发布于 2021-08-16 14:20:28
事实上,团结组织试图设置亲和力面具。它支持所有需要电源的CPU(大)。在我测试过的设备上有四个这样的核心。但实际上,该系统只允许启用其中的两个。因此,我只能使用两个OpenMP线程。
https://stackoverflow.com/questions/68746373
复制相似问题