тот же идентификатор потока при использовании openmp в android - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь использовать OpenMP в приложении android. В тестовой программе произошло нечто странное:

вот мой код для тестирования:

    int num_thread = omp_get_num_procs();
    LOGI("openmp available : %d thread(s)." , num_thread);
    omp_set_num_threads(8);
    omp_set_nested(0);

#pragma omp parallel
    {
        int id = omp_get_thread_num();
        LOGI("Hello world (%d) / (%d)", id,omp_get_num_threads() );
    }

В то время как вывод из logcat в android studio показывает:

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)

У меня есть несколько вопросов:

  1. он говорит, что доступно 8 ядер, поэтому я решил использовать все 8, пока он начал четыре.
  2. идентификатор из всех потоков одинаковые? или он запускался четыре раза?
  3. почему «omp_get_num_threads» всегда возвращает 1?

1 Ответ

1 голос
/ 17 января 2020

После нескольких тестов я наконец заставляю его работать. Так что проблема должна быть с настройками библиотеки.

В начале этого проекта я много искал о настройке библиотеки openmp в Android проекте. И я нашел много разных версий настроек. (например, установить «cppFlags», изменить в cmakelist и т. д. c). Я добавляю их все вместе. Это может привести к некоторым конфликтам

Поэтому я удаляю все настройки и использую только аргументы в 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() );
    }
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...