Шаг 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 );
}