在android中使用openmp时使用相同的线程id

在android中使用openmp时使用相同的线程id,android,openmp,Android,Openmp,我尝试在android应用程序中使用OpenMP。 在测试程序中,发生了一些奇怪的事情: 下面是我要测试的代码: android studio中logcat的输出显示: 2020-01-17 14:15:33.425 6961-7005/? I/MarkerTracker-dev: openmp available : 8 thread(s). 2020-01-17 14:15:33.426 6961-7005/? I/MarkerTracker-dev: Hello world (0) /

我尝试在android应用程序中使用OpenMP。 在测试程序中,发生了一些奇怪的事情:

下面是我要测试的代码:

android studio中logcat的输出显示:

2020-01-17 14:15:33.425 6961-7005/? I/MarkerTracker-dev: openmp available : 8 thread(s).
2020-01-17 14:15:33.426 6961-7005/? I/MarkerTracker-dev: Hello world (0) / (1)
2020-01-17 14:15:33.426 6961-7196/? I/MarkerTracker-dev: Hello world (0) / (1)
2020-01-17 14:15:33.426 6961-7194/? I/MarkerTracker-dev: Hello world (0) / (1)
2020-01-17 14:15:33.426 6961-7195/? I/MarkerTracker-dev: Hello world (0) / (1)
我有一些问题:

  • 它说有8个内核可供使用,所以我开始使用所有的8个,而它已经开始使用4个
  • 所有线程的id都相同吗?或者它运行了四次
  • 为什么“omp\u get\u num\u threads”总是返回1

  • 经过几次测试,我终于成功了。 所以问题应该出在库设置上

    在这个项目的开始,我搜索了很多关于Android项目中openmp库的设置。我发现了很多不同版本的设置。(例如,设置“cppFlags”、更改cmakelist等)。我把它们加在一起这可能会导致一些冲突

    因此,我删除了所有设置,只在cmakelist中使用参数:

    find_package(OpenMP QUIET)
    if(OpenMP_FOUND)
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
    else()
        message(WARNING "OpenMP not found.")
    endif()
    
    最后,我得到了正确的输出:

        int num_thread = omp_get_num_procs();
        LOGI("openmp available : %d thread(s)." , num_thread);
        omp_set_num_threads(4);
        omp_set_nested(0);
        #pragma omp parallel
        {
            LOGI("1. Hello world (%d) / (%d)", omp_get_thread_num(),omp_get_num_threads() );
        }
    

    我从来没有在Android上开发过,所以我只能在这里做出假设:也许你链接了一个存根OpenMP库,它总是返回0表示tid,1表示大小?显然,正如日志所示,您确实启动了4个线程,因为我怀疑prefix中的7194到7196值可能是操作系统中的线程id…您说得有道理!所以我假设openmp正在工作,但库发生了错误。我将检查库设置。您自己解决问题做得很好。无论如何,这是最好的学习方法
        int num_thread = omp_get_num_procs();
        LOGI("openmp available : %d thread(s)." , num_thread);
        omp_set_num_threads(4);
        omp_set_nested(0);
        #pragma omp parallel
        {
            LOGI("1. Hello world (%d) / (%d)", omp_get_thread_num(),omp_get_num_threads() );
        }
    
    2020-01-17 16:18:20.694 21594-21624/? I/MarkerTracker-dev: openmp available : 4 thread(s).
    2020-01-17 16:18:20.694 21594-21624/? I/MarkerTracker-dev: 1. Hello world (0) / (4)
    2020-01-17 16:18:20.694 21594-21736/? I/MarkerTracker-dev: 1. Hello world (3) / (4)
    2020-01-17 16:18:20.694 21594-21734/? I/MarkerTracker-dev: 1. Hello world (1) / (4)
    2020-01-17 16:18:20.695 21594-21735/? I/MarkerTracker-dev: 1. Hello world (2) / (4)