OpenMP在Android上只创建一个线程

时间:2017-12-27 19:48:46

标签: android c++ multithreading parallel-processing openmp

我正在使用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而且根本没有使用它。

0 个答案:

没有答案