![]() |
RefNUMA – библиотека для организации виртуальной общей памяти в программах, использующих MPI.А. О. Лацис
Пример 1. Инициализация, терминация, общее управление.Ниже представлен текст программы, все процессы которой совместно формируют выходной файл output.dat. В этом файле каждый процесс должен напечатать собственный номер и общее число процессов. Выдачи от разных процессов должны идти в порядке номеров процессов, не перепутываясь. Возможности MPI в этой программе напрямую не используются. #include <stdio.h>;
#include <stdlib.h>
#include <mpi.h>
#include <coarray.h>
#include <shared.h>
COARRAY_MEM_ALLOC( 2000000000l );
int main( int argc, char *argv[] )
{
int i, my_node, n_nodes;
FILE *fp;
/***/
COARRAY_Init( &argc, &argv );
my_node = coarray_my_node();
n_nodes = coarray_n_nodes();
if ( my_node == 0 )
{
fp = fopen( "output.dat", "w" );
fclose( fp );
}
for ( i = 0; i < n_nodes; i++ )
{
coarray_barrier();
if ( i == my_node )
{
fp = fopen( "output.dat", "a" );
fprintf( fp, "Hello, I am %d of %d\n", my_node, n_nodes );
fclose( fp );
}
}
COARRAY_Finalize();
return 0;
}
Заголовочные файлы coarray.h и shared.h должны включаться любой программой, использующей RefNUMA. Вызов макроса COARRAY_MEM_ALLOC() (этот макрос не выполняемый) обязателен. Он должен присутствовать в программе строго один раз, его рекомендуется располагать перед текстом функции main(). Аргумент этого макроса – целочисленная константа типа long – означает объем памяти в байтах, резервируемой программой для последующего использования библиотекой RefNUMA для своих внутренних нужд. Значение этого аргумента подбирается «на глазок», с запасом. В последующих примерах мы узнаем, как можно в конце работы программы спросить у RefNUMA, сколько зарезервированной таким образом памяти ей реально потребовалось. Вызовы COARRAY_Init() и COARRAY_Finalize() аналогичны MPI_Init() и MPI_Finalize(), и заменяют их (если есть вызов COARRAY_Init(), то MPI_Init() вызывать не следует). coarray_my_node() и coarray_n_nodes() служат для выяснения собственного номера процесса и общего числа процессов в параллельной программе, соответственно. Номер процесса равен номеру процесса MPI в коммуникаторе MPI_COMM_WORLD. Единственным средством синхронизации процессов в RefNUMA является барьерная синхронизация, которая выполняется при обращении к coarray_barrier(). В данном примере синхронизация используется для того, чтобы процессы записали собственный номер и общее число процессов в файл строго в порядке собственных номеров, и выдачи от разных процессов при этом не перемешивались. Для достижения этой цели в данном тривиальном примере можно было бы воспользоваться и вызовом функции MPI_Barrier( MPI_COMM_WORLD ), но в общем случае, в реальных программах, следует использовать coarray_barrier(). В отличие от функции MPI_Barrier(), функция coarray_barrier() выполняет не только барьерную синхронизацию, но и еще некоторые очень важные действия, без которых общая память RefNUMA просто не сможет работать. ◄ Введение Пример 2 ► |
|
||||||||||||||||||||||||||||||||
| Тел. +7(499)220-79-72; E-mail: inform@kiam.ru | ||||||||||||||||||||||||||||||||||