我正在使用OpenMP为项目添加并行性,我已经开始使用它的Windows版本(运行多个线程并保存时间)但不在Android上:OpenMP继续使用单个线程,而不是4.
让我说一下。我有一个C ++项目,使用Clang 3.8直接从Visual Studio工具链构建到ARM。使用OpenMP的项目部分是以下方法:
__inline static void func() {
int requested_threads = 4;
ofstream myfile;
myfile.open("/storage/emulated/0/test.txt");
omp_set_nested(1);
omp_set_dynamic(0);
omp_set_num_threads(requested_threads);
#pragma omp parallel for num_threads(requested_threads)
for (int i = 0; i < 4000; i++)
{
if (i == 0) {
myfile << "Number of threads = " << omp_get_num_threads() << "\n";
myfile << "Max threads allowed = " << omp_get_max_threads() << "\n";
myfile.close();
}
float x = pow(i, 10);
}
}
要使用OpenMP,我在C / C ++命令行附加选项中添加了-fopenmp
,在链接器命令行中添加了-lgomp
。我还将libgomp.a
作为附加依赖项。这样,项目就可以成功构建,生成.so
库。
然后将该库用于Xamarin C#项目。所有并行性都由本机C ++库通过OpenMP进行管理。 C#项目将简单地调用它。问题是它只使用 1 线程,即使我要求 4 。我已经打印出一些OpenMP运行时例程的返回,如下所示:
omp_get_num_procs() ........ 4
omp_get_dynamic() .......... 0
omp_get_nested() ........... 1
omp_get_max_threads ........ 4
omp_get_num_threads ........ 1
显然,它识别手机的所有4个可用核心。当应用程序运行时,它最多占用手机CPU最大值的25%。
我已经进行了广泛的搜索,但我得到的距离越近question。我不确定为什么我不能让所有内核运行,也许操作系统会提出一些限制,或者我可能没有正确引用OpenMP而且根本没有使用它。