Как настроить OpenMP для использования целых гиперпотоков для параллельной обработки? - PullRequest
0 голосов
/ 14 октября 2019

Пожалуйста, помогите мне, я хочу использовать OpenMP для параллельной обработки в моей программе со всеми потоками. Я настраиваю его так же:

    #pragma omp parallel
    {
       omp_set_num_threads(272);
       region my_routine processing;
    }

Когда я его запускаю, я использую компилятор "top" для проверки производительности использования процессора, и просто иногда он архивирует 6800% (почти менее 5500%) - это не стабильно. Я хочу, чтобы он был стабильным (всегда архивирует 6800%) во время выполнения моей программы.

Где неправильно использовать OpenMP или у нас есть какой-то другой метод для использования целых потоков?

Большое спасибо.

Это моя платформа:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                272
On-line CPU(s) list:   0-271
Thread(s) per core:    4
Core(s) per socket:    68
Socket(s):             1
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 87
Model name:            Intel(R) Xeon Phi(TM) CPU 7250 @ 1.40GHz
Stepping:              1
CPU MHz:               1392.507
BogoMIPS:              2799.81
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
NUMA node0 CPU(s):     0-271
NUMA node1 CPU(s):

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Я выполняю на CentOS7 и немного путаюсь с вашим гидом. Это моя NUMA-топология и монитор htop, когда я запускаю приложение. Вы можете видеть, что он использует только 1 поток / ядро ​​и с одним потоком также не может архивировать 100%. Как я могу использовать 4 потока / ядро ​​или 100% 1 поток / ядро? enter image description here enter image description here

0 голосов
/ 14 октября 2019

Шаг 0: Безопасность прежде всего:
Узнайте у своей группы поддержки HPC-провайдера кластера, не считают ли они вредными установку такого высокого уровня рабочих нагрузок на собственное / управляемое кластерное устройство. (s).

Шаг 1: набор для летного испытания с включенным дымом
подготовка lstopo команда (apt-get или требуетсяваш администратор, чтобы исправить это, если необходимо) и создайте системную карту NUMA-топологии в pdf-файл и разместите ее здесь
prepare htop команда (apt-get или попросите вашего администратора исправитьэто, при необходимости),
настроить F2
Настройка METERS для отображения CPUs (1&2/4): first half in 2 shorter columns на левой панели MONITOR,
настройка METERS для отображения CPUs (3&4/4): second half in 2 shorter columns длялевая панель MONITOR,
setup COLUMNS, чтобы показать хотя бы поля { PPID, PID, TGID, CPU, CPU%, STATUS, command } столбца

Шаг 2: при работающем htop -мониторе, запустить скомпилированныйКод OpenMP

Ожидайте чего-то выше этого на терминальном CLI, но монитор htop покажет ландшафт рабочей сцены NUMA-CPU-loadloadsлучше, чем любое другое число:

Real time: 23.027 s
User time: 45.337 s
Sys. time: 0.047 s
Exit code: 0

stdout прочтет об этом:

WARMUP: OpenMP thread[  0] instantiated as thread[  0]
WARMUP: OpenMP thread[  3] instantiated as thread[  3]
...
WARMUP: OpenMP thread[272] instantiated as thread[272]
my_routine():  thread[  0] START_TIME(           2078891848 )
my_routine():  thread[  2] START_TIME(           -528891186 )
...
my_routine():  thread[  2] ENDED_TIME(            635748478 ) sum =  1370488.801186
HOT RUN:    in thread[  2] my_routine() returned                          10.915321 ....
my_routine():  thread[  4] ENDED_TIME(          -1543969584 ) sum =  1370489.030301
HOT RUN:    in thread[  4] my_routine() returned                          11.133672 ....
my_routine():  thread[  1] ENDED_TIME(           -213996360 ) sum =  1370489.060176
HOT RUN:    in thread[  1] my_routine() returned                          11.158897 ....
...
my_routine():  thread[  0] ENDED_TIME(           -389214506 ) sum =  1370489.079366
HOT RUN:    in thread[270] my_routine() returned                          11.149798 ....
my_routine():  thread[  3] ENDED_TIME(           -586400566 ) sum =  1370489.125829
HOT RUN:    in thread[269] my_routine() returned                          11.091430 ....

OpenMP ver(201511)...finito

источник макета (на TiO. запустить):

#include <omp.h>   // ------------------------------------ compile flags: -fopenmp -O3
#include <stdio.h>

#define MAX_COUNT    999999999 
#define MAX_THREADS        272

double my_routine()
{
     printf( "my_routine():  thread[%3d] START_TIME( %20d )\n", omp_get_thread_num(), omp_get_wtime() );
     double temp = omp_get_wtime(),
            sum  = 0;

     for ( int count = 0; count < MAX_COUNT; count++ )
     {
           sum += ( omp_get_wtime() - temp ); temp = omp_get_wtime();
     }
     printf( "my_routine():  thread[%3d] ENDED_TIME( %20d ) sum = %15.6f\n", omp_get_thread_num(), omp_get_wtime(), sum );
     return( sum );
}

void warmUp() // -------------------------------- prevents performance skewing in-situ
{             // NOP-alike payload, yet enforces all thread-instantiations to happen
    #pragma omp parallel for num_threads( MAX_THREADS )
    for ( int i = 0; i < MAX_THREADS; i++ )
         printf( "WARMUP: OpenMP thread[%3d] instantiated as thread[%3d]\n", i, omp_get_thread_num() );
}

int main( int argc, char **argv )
{
    omp_set_num_threads( MAX_THREADS ); warmUp(); // ---------- pre-arrange all threads

    #pragma omp parallel for
    for ( int i = 0; i < MAX_THREADS; i++ )
         printf( "HOT RUN:    in thread[%3d] my_routine() returned %34.6f ....\n", omp_get_thread_num(), my_routine() );

    printf( "\nOpenMP ver(%d)...finito", _OPENMP );
}
...