Отсутствует функция OpenMP: приоритет потоков - PullRequest
0 голосов
/ 23 марта 2009

Кто-нибудь думает об этом. Особенности OpenMP для настройки мышц процессора для работы с гантелями. В моем исследовании openmp мы не можем установить приоритет потока для выполнения блочного кода с мощной мускулатурой. Только один способ (функция _beginthreadex или CreateThread с 5. параметрами) для создания потоков с самым высоким приоритетом

Вот код для этой проблемы:

Это ручная настройка.

int numberOfCore = ( execute __cpuid to obtain number of cores on your cpu ).

HANDLES* hThreads = new HANDLES[ numberOfCore ];
hThreads[0] = _beginthreadex( NULL, 0, someThreadFunc, NULL, 0, NULL );

SetThreadPriority( hThreads[0], HIGH_PRIORITY_CLASS );

WaitForMultipleObjects(...); 

Вот я хочу увидеть эту часть:

#pragma omp parallel
{
#pragma omp for ( threadpriority:HIGH_PRIORITY_CLASS )
 for( ;; ) { ... }
}

Или

#pragma omp parallel
{
// Generally this function greatly appreciativable.
_omp_set_priority( HIGH_PRIORITY_CLASS );
#pragma omp for
 for( ;; ) { ... }
}

Я не знаю, был ли способ установить приоритет с помощью openmp, пожалуйста, сообщите нам.

Ответы [ 2 ]

3 голосов
/ 23 марта 2009

Вы можете сделать SetThreadPriority в теле цикла, не требуя специальной поддержки от OpenMP:

for (...)
{
  DWORD priority=GetThreadPriority(...);
  SetThreadPriority(...);
  // stuff
  SetThreadPriority(priority);
}
1 голос
/ 09 марта 2014

Простой тест показывает неожиданные результаты: Я провел простой тест в Visual Studio 2010 (Windows 7):

    #include <stdio.h>
    #include <omp.h>
    #include <windows.h>

    int main()
    {
        int tid, nthreads;

        SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);

        #pragma omp parallel private(tid) num_threads(4)
        {
            tid = omp_get_thread_num();
            printf("Thread %d: Priority = %d\n", tid, GetThreadPriority(GetCurrentThread()));
        }

        printf("\n");

        #pragma omp parallel private(tid) shared(nthreads) num_threads(4)
        {
            tid = omp_get_thread_num();

            #pragma omp master
            {
                printf("Master Thread %d: Priority = %d\n", tid, GetThreadPriority(GetCurrentThread()));
            }
        }

        #pragma omp parallel num_threads(4)
        {
            SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
        }

        printf("\n");

        #pragma omp parallel private(tid) num_threads(4)
        {
            tid = omp_get_thread_num();
            printf("Thread %d: Priority = %d\n", tid, GetThreadPriority(GetCurrentThread()));
        }

        return 0;
    }

Вывод:

    Thread 1: Priority = 0
    Thread 0: Priority = 1
    Thread 2: Priority = 0
    Thread 3: Priority = 0

    Master Thread 0: Priority = 1

    Thread 0: Priority = 1
    Thread 1: Priority = 1
    Thread 3: Priority = 1
    Thread 2: Priority = 1

Пояснение: Основные потоки OpenMP выполняются с приоритетом потока основного. Другие потоки OpenMP остаются в обычном приоритете. При ручной установке приоритета потоков OpenMP потоки остаются с этим приоритетом.

...