Unity 减少了可用 OpenMP 线程的数量

Unity reduces the number of available OpenMP threads

我在共享 android 库中使用 OpenMP。有一个示例方法只检查 CPU 的数量和最大线程数。

int maxThreads = omp_get_max_threads();
int numProcs = omp_get_num_procs();

当我从基本 android 应用程序 (AppCompatActivity) 调用此方法时,两个值在配备 Qualcomm Snapdragon 855 CPU(8 核)的设备上都设置为 8。

maxThreads = 8;
numProc = 8;

当我尝试从 Unity 应用程序调用此方法时,返回的最大线程数和进程数为 2。

maxThreads = 2;
numProc = 2;

为什么Unity应用程序中的最大线程数比基本应用程序中的少?有没有办法增加实际使用的并行线程数?

您没有说明您使用的是哪种 OpenMP 实现,知道这肯定很有用。

但是,假设 Android 在此级别的行为类似于 Linux,那么可能发生的情况是 Unity 正在设置进程的关联掩码(参见 sched_{get,set}affinity(...),它反映了进程应该使用的 logicalCPU。 OpenMP 运行时几乎肯定会参考它来确定创建有意义的线程数。

在 Linux 上,进程可以将线程关联到 logicalCPU,这在其传入关联掩码之外,但这肯定是不良行为,并且可能导致性能不佳,因为从根本上说,您的进程处于堆的底部,应该接受更高级别调度程序告诉它要做的事情。

为了确保您可以编写一个函数来打印亲和掩码,然后您可以看到发生了什么。或者,OpenMP 实现可能有一个令人羡慕的条件,它会告诉您它在做什么。 (例如,如果使用 Intel 或 LLVM 运行时,请尝试 KMP_AFFINITY=verbose。)

确实,Unity 尝试设置关联掩码。它支持所有耗电 CPU (BIG)。我测试过的设备上有四个这样的内核。但实际上系统只允许启用其中两个。结果我只能使用两个 OpenMP 线程。