Скорость работы программы

Содержание

Слайд 2

Перемножение void mult_matrices(double **a, double **b, double **c, int n) {

Перемножение
void mult_matrices(double **a, double **b, double **c, int n)
{
int i,

j, k;
double sum;
FORI
{
FORJ
{
FORK
{
c[i][j] += a[i][k] * b[k][j];
}
}
}
}
Слайд 3

Варианты циклов первый цикл по i, второй по j, третий по

Варианты циклов

первый цикл по i, второй по j, третий по k

- кратко назовем ijk
первый цикл по i, второй по k, третий по j - кратко назовем ikj
первый цикл по j, второй по i, третий по k - кратко назовем jik
первый цикл по j, второй по k, третий по i - кратко назовем jki
первый цикл по k, второй по i, третий по j - кратко назовем kij
первый цикл по k, второй по j, третий по i - кратко назовем kji
Слайд 4

Результаты.

Результаты.

Слайд 5

Оптимизация

Оптимизация

Слайд 6

Разворачивание циклов int i, j, k; int i1,i2; double tmp,tmp1,tmp2; double

Разворачивание циклов

int i, j, k;
int i1,i2;
double tmp,tmp1,tmp2;
double

temp;
double *p,*ci,*ci1,*ci2;
for(i=0, i1=1, i2=2; i < n; i+= 3,i1+=3, i2+= 3){
for( j= 0;j < n; j++){
p=&b[j][0];
tmp= a[i][j];tmp1=a[i1][j];tmp2=a[i2][j];
ci=&c[i][0]; ci1=&c[i1][0]; ci2=&c[i2][0];
for( k=0; k < n; k++){
temp=p[k];
ci[k]+= tmp*temp;ci1[k]+=tmp1*temp; ci2[k]+=tmp2*temp;
}
}
}
Слайд 7

Результаты.

Результаты.

Слайд 8

Разворачивание циклов int i,j,k; double *q,*b1,*b2,*b3,*b4,*b5,*b6,*b7,*b8,*b9,*b10; double a1,a2,a3,a4,a5,a6,a7,a8,a9,a10; for(k = 0;

Разворачивание циклов

int i,j,k;
double *q,*b1,*b2,*b3,*b4,*b5,*b6,*b7,*b8,*b9,*b10;
double a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
for(k = 0; k < n; k+=

10) {
b1=&b[k][0]; b2=&b[k+1][0]; b3=&b[k+2][0]; b4=&b[k+3][0];
b5=&b[k+4][0]; b6= &b[k+5][0];b7=&b[k+6][0]; b8=&b[k+7][0];
b9= &b[k+8][0];b10=&b[k+9][0];
for(i = 0; i < n; i++) {
q=&c[i][0];
a1 = a[i][k]; a2 = a[i][k+1]; a3 = a[i][k+2]; a4 = a[i][k+3];
a5 = a[i][k+4]; a6 = a[i][k+5]; a7 = a[i][k+6]; a8 = a[i][k+7];
a9 = a[i][k+8]; a10 = a[i][k+9];
for(j = 0;j < n; j++) {
q[j] += a1*b1[j]+a2*b2[j]+a3*b3[j]+a4*b4[j]+a5*b5[j]+
a6*b6[j]+a7*b7[j]+a8*b8[j]+a9*b9[j]+a10*b10[j];
}
}
}
Слайд 9

Результат

Результат

Слайд 10

dgemm Си extern void dgemm_(char *tra, char *trb, int *m, int

dgemm

Си
extern void dgemm_(char *tra, char *trb, int *m, int *n, int

*k, double *alpha, double *a, int *lda,double *b, int *ldb, double *beta, double *c, int *ldc);

SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)
.. Scalar Arguments
DOUBLE PRECISION ALPHA,BETA
INTEGER K,LDA,LDB,LDC,M,N
CHARACTER TRANSA,TRANSB
* ..
* .. Array Arguments .
.
DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)
* ..
*
* Purpose
* =======
*
* DGEMM performs one of the matrix-matrix operations
*
* C := alpha*op( A )*op( B ) + beta*C,

Слайд 11

transA='T'; transB='T'; alpha=1.0; zero=0.0; // mult_matrices(a, b, c,n); dgemm_(&transA,&transB,&n,&n,&n,&alpha,a,&n,b,&n,&zero,c,&n);

transA='T';
transB='T';
alpha=1.0;
zero=0.0;
// mult_matrices(a, b, c,n);
dgemm_(&transA,&transB,&n,&n,&n,&alpha,a,&n,b,&n,&zero,c,&n);

Слайд 12

Компиляция cc -g -o matmul matmuldot.o -lm -lgoto -lpthread -lgfortran Makefile

Компиляция

cc -g -o matmul matmuldot.o -lm -lgoto -lpthread -lgfortran

Makefile
PROG=matmul
TESTOBJ=matmuldot.o
CFLAGS=-g
CLFLAGS=-g
LIBS=-lm -lgoto -lpthread

-lgfortran
all:$(TESTOBJ)
$(CC) $(CLFLAGS) -o $(PROG) $(TESTOBJ) $(LIBS)
clean:
rm *.o $(PROG)
%.o: %.c $(CC) -c -o $@ $< $(CFLAGS)
Слайд 13

Классификация Флина.

Классификация Флина.

Слайд 14

Openmp

Openmp

Слайд 15

Включает/отключает режим, в котором количество создаваемых нитей при входе в параллельную

Включает/отключает режим, в котором количество создаваемых нитей при входе в параллельную

область может меняться динамически.
Начальное значение: Если компилятор не поддерживает данный режим, то false. Иначе – зависит от реализации.
export OMP_DYNAMIC=true
void omp_set_dynamic(int dynamic_threads);
Узнать значение переменной можно:
int omp_get_dynamic(void);

OMP_DYNAMIC

Слайд 16

#include #include int n; #pragma omp threadprivate(n) int main(int argc, char

#include
#include
int n;
#pragma omp threadprivate(n)
int main(int argc, char *argv[])
{
int num;
n=1;
#pragma

omp parallel private (num)
{
num=omp_get_thread_num(); printf("Значение n на нити %d (на входе): %d\n", num, n);
n=omp_get_thread_num() + 1; printf("Значение n на нити %d (на выходе): %d\n", num, n);
}
printf("Значение n (середина): %d\n", n);
#pragma omp parallel private (num)
{
num=omp_get_thread_num(); printf("Значение n на нити %d (ещё раз): %d\n", num, n);
}
n=1;
#pragma omp parallel copyin(n)
{
printf("Значение n: %d\n", n);
}
return 0; }
Слайд 17

Вложенные регионы int main(){ #pragma omp parallel // параллельный регион 1

Вложенные регионы

int main(){
#pragma omp parallel // параллельный регион 1
{


#pragma omp parallel
{
}
}
Слайд 18

Вложенные регионы

Вложенные регионы

Слайд 19

Слайд 20

Архитектура Fermi

Архитектура Fermi

Слайд 21

Системы с разделенной памятью MPP- системы(Массово-параллельная архитектура)

Системы с разделенной памятью MPP- системы(Массово-параллельная архитектура)

Слайд 22

Системы с массовым параллелизмом (МРР)‏

Системы с массовым параллелизмом (МРР)‏

Слайд 23

Особенности MPP. Достоинство Хорошая масштабируемость. Недостатки Сложности межпроцессорного взаимодействия Разработка программ.

Особенности MPP.

Достоинство
Хорошая масштабируемость.
Недостатки
Сложности межпроцессорного взаимодействия
Разработка программ.

Слайд 24

Кластера Кластеры высокой доступности Обозначаются аббревиатурой HA (англ. High Availability —

Кластера

 
Кластеры высокой доступности
Обозначаются аббревиатурой HA (англ. High Availability — высокая доступность).

Создаются для обеспечения высокой доступности сервиса, предоставляемого кластером. Избыточное число узлов, входящих в кластер, гарантирует предоставление сервиса в случае отказа одного или нескольких серверов. Типичное число узлов — два, это минимальное количество, приводящее к повышению доступности. Создано множество программных решений для построения такого рода кластеров. В частности, для GNU/Linux, FreeBSD и Solaris существует проект бесплатного ПО Linux-HA.
Кластеры распределения нагрузки
Принцип их действия строится на распределении запросов через один или несколько входных узлов, которые перенаправляют их на обработку в остальные, вычислительные узлы. Первоначальная цель такого кластера — производительность, однако, в них часто используются также и методы, повышающие надежность. Подобные конструкции называются серверными фермами. Программное обеспечение (ПО) может быть как коммерческим (OpenVMS Cluster, Platform LSF HPC, Sun Grid Engine, Moab Cluster Suite, Maui Cluster Scheduler), так и бесплатным (Linux Virtual Server, Mosix).
Слайд 25

Кластеры повышенной производительности Обозначаются англ. аббревиатурой HPC (High performance cluster). Позволяют

Кластеры повышенной производительности
Обозначаются англ. аббревиатурой HPC (High performance cluster). Позволяют увеличить

скорость расчетов, разбивая задание на параллельно выполняющиеся потоки. Используются в научных исследованиях. Одна из типичных конфигураций — набор серверов с установленной на них операционной системой Linux, такую схему принято называть кластером Beowulf. Для HPC создается специальное ПО, способное эффективно распределять задачу между узлами.
Эффективные связи между серверами в кластере позволяют им поддерживать связь и оперативно обмениваться данными, поэтому такие кластеры хорошо приспособлены для выполнения процессов, использующих общие данные.
Системы распределенных вычислений (grid)
Такие системы не принято считать кластерами, но их принципы в значительной степени сходны с кластерной технологией. Их также называют grid-системами. Главное отличие — низкая доступность каждого узла, то есть невозможность гарантировать его работу в заданный момент времени (узлы подключаются и отключаются в процессе работы), поэтому задача должна быть разбита на ряд независимых друг от друга процессов. Такая система, в отличие от кластеров, не похожа на единый компьютер, а служит упрощенным средством распределения вычислений. Нестабильность конфигурации, в таком случае, компенсируется большим числом узлов.
Слайд 26

Вычислительные ресурсы ЮГИНФО LINUX-кластер (10 узлов, 2003 г., CPU P4 2.4

Вычислительные ресурсы ЮГИНФО

LINUX-кластер (10 узлов, 2003 г., CPU P4 2.4 Ггц,

память 512 Мб )
INFINI-кластер (21 узел, 2005 г ., CPU P4 3.4 Ггц, память 2 Гб.)
IBMX-кластер (12 узлов, 2008 г. CPU Xeon 3.0 Ггц, память 8 Гб.))
Слайд 27

Слайд 28

Слайд 29

Слайд 30

Слайд 31

Слайд 32

Софт INTEL 11.0 icc icpc ifort GCC gcc g++ gfortran MPI

Софт

INTEL 11.0
icc
icpc
ifort
GCC
gcc
g++
gfortran
MPI

Слайд 33

Системы управления заданиями PBS (Portable Batch System) – система управления ресурсами

Системы управления заданиями

PBS (Portable Batch System) – система управления ресурсами и

загрузкой кластеров. Может работать на большом числе различных платформ: Linux, FreeBSD, NetBSD, Digital Unix, Tru64, HP-UX, AIX, IRIX, Solaris. В настоящее время существует свободная и обладающая более широкими возможностями реализация PBS, называемая Torque.
LSF (Load Sharing Facility) – система, аналогичная PBS. Разработана компанией Platform Computing. Также способна работать на множестве платформ.
NQE (Network Queuing Environment) – продукт компании Cray Research, использующийся чаще всего как менеджер ресурсов на суперкомпьютерах, кластерах и системах Cray, хотя может работать и на других платформах.
LoadLeveler – продукт компании IBM, управляющий балансом загрузки крупных кластеров. Используется в основном на кластерах IBM.
Condor – свободно доступный менеджер ресурсов, разработанный в основном студентами различных университетов Европы и США. Аналогичен вышеперечисленным. Работает на различных платформах UNIX и Windows NT
Easy-LL – совместная разработка IBM и Cornell Theory Center, предназначенная для управления крупным кластером IBM в этом центре. По сути является объединением LoadLeveler и продукта EASY лаборатории Argonne National Lab.
Слайд 34

PBS. Оригинальный opensource проект OpenPBS разработанный в 1998 году MRJ.(на данный

PBS.

Оригинальный opensource проект OpenPBS разработанный в 1998 году MRJ.(на данный момент

не поддерживается)
TORQUE ( Terascale Open-Source Resource and QUEue Manager) - проект основанный на OpenPBS и поддерживаемый Adaptive Computing Enterprises, Inc
PBS Professional (PBS Pro) - коммерческая система предлагаемая Altair Engineering.
Слайд 35

Архитектура PBS. Сервер (pbs_server) который является центром PBS, именно сервер принимает

Архитектура PBS.

Сервер (pbs_server) который является центром PBS, именно сервер принимает задания

от пользователей, удаляет задания, изменяет задания и выполняет другие функции.
Планировщик (pbs_sched) который управляет расстановкой задач в очереди и определяет, какая задача будет запущенна на выполнение.
Mom (machine oriented miniserver) (pbs_mom) исполняет пользовательский скрипт и следит, чтобы он работал отведенное время. На всех компьютерах, где должны выполнятся задания должен быть запущен pbs_mom.
Слайд 36

PBS наиболее часто используемые команды qsub – команда для запуска задачи

PBS наиболее часто используемые команды

qsub – команда для запуска задачи
qstat –

для просмотра состояния очереди
pbsnodes(pestat) – состояния узлов в очереди
Слайд 37

qsub qsub [options] PBS_script #!/bin/sh #PBS -l walltime=1:00:00 #PBS -l nodes=2:LINUX

qsub

qsub [options] PBS_script
#!/bin/sh
#PBS -l walltime=1:00:00
#PBS -l nodes=2:LINUX
cd $PBS_O_WORKDIR
mpirun -np 2 ping_DELLE

Результат

работы программы без каких либо дополнительных усилий с Вашей стороны будет записываться в файл и помещаться в тот каталог, из которого было запущено задание. Имя выходного файла формируется автоматически следующим образом: <имя скрипта>.o<номер задания>,   a в файл <имя скрипта>.e<номер задания> - будет записываться стандартный канал диагностики (ошибок).
Слайд 38

опции команды qsub q - название очереди пакетной обработки -l -

опции команды qsub

q - название очереди пакетной обработки
-l - набор технических

параметров, набираемых через ",":
walltime - максимальное время выполнения задачи,
nodes - требуемое количество процессоров (после указания количества процессоров после ":" следует указывать название очереди)
-m - события, происходящие в процессе пакетной обработки задачи, о которых следует извещать по e-mail: b - начало, e - завершение, a - прекращение работы по ошибке;
-M - e-mail адрес, на который будут направляться все служебные сообщения о состоянии задачи
-r - (y/n) (т.е. да или нет) следует ли восстанавливать задачу при перезагрузке узлов
Слайд 39

Команда qstat

Команда qstat

Слайд 40

Описание вывода qstat Job id - уникальный идентификатор задачи Name -

Описание вывода qstat

Job id - уникальный идентификатор задачи
Name - имя исполняемой

задачи
User - имя владельца задачи
Time Use - общее процессорное время, использованное задачей на данный момент
S - состояние задачи
Q - находится в очереди
R - вычисляется
E - произошла ошибка при выполнении
Queue - название очереди, в которой запущена задача
Слайд 41

команда pestat

команда pestat

Слайд 42

qdel qdel - удаление задания qdel 36807

qdel

qdel - удаление задания

qdel 36807

Слайд 43

Распараллеливания программ SPMD (Single Program Multiple Date) - на всех процессорах

Распараллеливания программ

SPMD (Single Program Multiple Date) - на всех процессорах выполняются

копии одной программы, обрабатывающие разные блоки данных;
MPMD (Multiple Program Multiple Date) - на процессорах выполняются разные программы, обрабатывающие разные данные.
Слайд 44

Методологический подхода(Фостера) к решению задачи на многопроцессорной системе разбиение задачи на

Методологический подхода(Фостера) к решению задачи на многопроцессорной системе

разбиение задачи на минимальные

независимые подзадачи (partitioning);
установление связей между подзадачами (communication);
объединение подзадач с целью минимизации коммуникаций (agglomeration);
распределение укрупненных подзадач по процессорам таким образом, чтобы обеспечить равномерную загрузку процессоров (mapping).
Слайд 45

Общая схема распараллеливания if (proc_id == 0) { task1(); } if

Общая схема распараллеливания

if (proc_id == 0) {
task1();

}
if (proc_id == 1) {
task2();
}
resutl=reduce(result_task1, result_task2, ...)
Слайд 46

Общая организация MPI Коммуникационная библиотека MPI стала общепризнанным стандартом в параллельном

Общая организация MPI

Коммуникационная библиотека MPI стала общепризнанным стандартом в параллельном

программировании для систем с распределенной памятью с использованием механизма передачи сообщений. Полное и строгое описание среды программирования MPI можно найти в авторском описании разработчиков MPI: The Complete Reference
http://rsusu1.rnd.runnet.ru/parallel/mpi/index.html
http://parallel.ru/tech/tech_dev/mpi.html
MPI программа представляет собой набор независимых процессов, каждый из которых выполняет свою собственную программу.
Процессы MPI программы взаимодействуют друг с другом посредством вызова коммуникационных процедур.
Слайд 47

Общая организация MPI (продолжение)‏ Для идентификации наборов процессов вводится понятие группы,

Общая организация MPI (продолжение)‏

Для идентификации наборов процессов вводится понятие группы, объединяющей все

или какую-то часть процессов.
Каждая группа образует область связи, с которой связывается специальный объект - коммуникатор области связи.
При инициализации MPI создается предопределенная область связи, содержащая все процессы MPI-программы, с которой связывается предопределенный коммуникатор MPI_COMM_WORLD.
Процессы внутри группы нумеруются целым числом в диапазоне 0..groupsize-1.
Слайд 48

Структура MPI Около 130 функций - функции инициализации и закрытия MPI

Структура MPI
Около 130 функций
- функции инициализации и закрытия MPI процессов;
- функции,

реализующие коммуникационные операции типа точка-точка;
- функции, реализующие коллективные операции;
- функции для работы с группами процессов и коммуникаторами;
- функции для работы со структурами данных;
- функции формирования топологии процессов.
Слайд 49

Характеристики функций Локальная функция – выполняется внутри вызывающего процесса. Ее завершение

Характеристики функций

Локальная функция – выполняется внутри вызывающего процесса. Ее завершение не

требует коммуникаций.
Нелокальная функция – для ее завершения требуется выполнение MPI-процедуры другим процессом.
Глобальная функция – процедуру должны выполнять все процессы группы. Несоблюдение этого условия может приводить к зависанию задачи.
Блокирующая функция – блокирует выполнение процесса до полного завершения коммуникационной операции. Возврат управления из процедуры гарантирует возможность повторного использования параметров, участвующих в вызове.
Неблокирующая функция – возврат из процедуры происходит немедленно, без ожидания окончания операции и до того, как будет разрешено повторное использование параметров, участвующих в запросе. Завершение неблокирующих операций осуществляется специальными функциями.
Слайд 50

Особенности MPI в Си Все процедуры являются функциями, и большинство из

Особенности MPI в Си

Все процедуры являются функциями, и большинство из них

возвращает код ошибки.
При использовании имен подпрограмм и именованных констант необходимо строго соблюдать регистр символов.
Массивы индексируются с 0.
Логические переменные представляются типом int (true соответствует 1, а false – 0).
Определение всех именованных констант, прототипов функций и определение типов выполняется подключением файла mpi.h.
Слайд 51

Соответствие между MPI-типами и типами языка C

Соответствие между MPI-типами и типами языка C

Слайд 52

Особенности MPI в Фортране большинство MPI процедур являются подпрограммами (вызываются с

Особенности MPI в Фортране

большинство MPI процедур являются подпрограммами (вызываются с помощью

оператора CALL),
код ошибки возвращают через дополнительный последний параметр процедуры.
Несколько процедур, оформленных в виде функций, код ошибки не возвращают.
Не требуется строгого соблюдения регистра символов в именах подпрограмм и именованных констант.
Массивы индексируются с 1.
Объекты MPI, которые в языке C являются структурами, в языке FORTRAN представляются массивами целого типа.
Определение всех именованных констант и определение типов выполняется подключением файла mpif.h
Слайд 53

Соответствие между MPI-типами и типам языка FORTRAN Тип MPI Тип языка

Соответствие между MPI-типами и типам языка FORTRAN

Тип MPI Тип языка FORTRAN
MPI_INTEGER INTEGER
MPI_REAL REAL
MPI_DOUBLE_PRECISION DOUBLE PRECISION
MPI_COMPLEX COMPLEX
MPI_LOGICAL LOGICAL
MPI_CHARACTER CHARACTER(1)
MPI_BYTE
MPI_PACKED

Слайд 54

Базовые функции MPI Функция инициализации MPI_Init C/C++: int MPI_Init(int *argc, char ***argv) Fortran: MPI_INIT(IERROR) INTEGER IERROR

Базовые функции MPI

Функция инициализации MPI_Init
C/C++:
int MPI_Init(int *argc, char ***argv)
Fortran:
MPI_INIT(IERROR)
INTEGER IERROR

Слайд 55

Базовые функции MPI Функция завершения MPI программ MPI_Finalize. C/C++: int MPI_Finalize(void) Fortran: MPI_FINALIZE(IERROR) INTEGER IERROR

Базовые функции MPI

Функция завершения MPI программ MPI_Finalize.
C/C++:
int MPI_Finalize(void)
Fortran:
MPI_FINALIZE(IERROR)
INTEGER IERROR

Слайд 56

Базовые функции MPI Функция определения числа процессов в области связи MPI_Comm_size.

Базовые функции MPI

Функция определения числа процессов в области связи MPI_Comm_size.
C/C++:
int MPI_Comm_size(MPI_Comm

comm, int *size)
Fortran:
MPI_COMM_SIZE(COMM, SIZE, IERROR)
INTEGER COMM, SIZE, IERROR
IN comm - коммуникатор
OUT size - число процессов в области связи коммуникатора comm.
Слайд 57

Базовые функции MPI . Функция определения номера процесса MPI_Comm_rank C/C++: int

Базовые функции MPI

. Функция определения номера процесса MPI_Comm_rank
C/C++:
int MPI_Comm_rank(MPI_Comm comm, int

*rank)
Fortran:
MPI_COMM_RANK(COMM, RANK, IERROR)
INTEGER COMM, RANK, IERROR
IN comm - коммуникатор
OUT rank - номер процесса, вызвавшего функцию.
Слайд 58

Базовые функции MPI Функция передачи сообщения MPI_Send. C/C++: int MPI_Send(void* buf,

Базовые функции MPI

Функция передачи сообщения MPI_Send.
C/C++:
int MPI_Send(void* buf, int count, MPI_Datatype

datatype, int dest, int
tag, MPI_Comm comm)
Fortran:
MPI_SEND(BUF, COUNT, DATATYPE, DEST, TAG, COMM, IERROR)
BUF(*)
INTEGER COUNT, DATATYPE, DEST, TAG, COMM, IERROR
IN buf - адрес начала расположения пересылаемых данных
IN count - число пересылаемых элементов
IN datatype - тип посылаемых элементов
IN dest - номер процесса-получателя в группе, связанной с
коммуникатором comm
IN tag - идентификатор сообщения
IN comm - коммуникатор области связи
Слайд 59

Базовые функции MPI Функция приема сообщения MPI_Recv. C/C++: int MPI_Recv(void* buf,

Базовые функции MPI

Функция приема сообщения MPI_Recv.
C/C++:
int MPI_Recv(void* buf, int count, MPI_Datatype

datatype, int source,
int tag, MPI_Comm comm, MPI_Status *status)
Fortran:
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM,
STATUS, IERROR)
BUF(*)
INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM,
STATUS(MPI_STATUS_SIZE), IERROR
OUT buf - адрес начала расположения принимаемого сообщения
IN count - максимальное число принимаемых элементов
IN datatype - тип элементов принимаемого сообщения
IN source - номер процесса-отправителя
IN tag - идентификатор сообщения
IN comm - коммуникатор области связи
OUT status - атрибуты принятого сообщения
Слайд 60

Базовые функции MPI Функция отсчета времени (таймер) MPI_Wtime. C/C++: double MPI_Wtime(void)

Базовые функции MPI

Функция отсчета времени (таймер) MPI_Wtime.
C/C++:
double MPI_Wtime(void)
Fortran:
DOUBLE PRECISION MPI_WTIME()
Функция опроса

разрешения таймера MPI_Wtick.
C/C++:
double MPI_Wtick(void)
Fortran:
DOUBLE PRECISION MPI_WTICK()