next up previous contents
Next: Сложности Up: Примеры Previous: Реализация профилирования   Contents

Реализация библиотеки MPI

На системе Unix, в которой библиотека MPI выполнена на Си, имеются различные опции. Рассмотрим далее две из них, наиболее распространенные. Критерием отбора лучших вариантов является то, поддерживает ли компилятор и редактор связей weak символы (символы со слабой связью).

Системы с $weak$ символами

Если компилятор и редактор связей поддерживают внешние слабые символы (например, Solaris 2.x, другая система V.4 машин), то тогда требуется единственная библиотека при использовании #pragma weak

#pragma weak MPI_Example = PMPI_Example int PMPI_Example(/* соответствующие args */) { /* полезное содержание */ }

Результом этой #pragma является определение внешнего символа MPI_EXAMPLE как слабого. Это означает, что редактор связей не будет считать ошибкой тот факт, что имеется другое определение символа (например в библиотеке профилирования), однако, если никакого другого определения не существует, то редактор связей использует это слабое определение.

Системы без $weak$ символов

В случае отсутствия слабых символов одним возможным решением является использование макро-препроцессора Си таким образом:

#ifdef PROFILELIB # ifdef __STDC__ # define FUNCTION(name) P##name # else # define FUNCTION(name) P/**/name # endif #else # define FUNCTION(name) name #endif

Каждая из видимых пользователем функций в библиотеке была бы затем объявлена таким образом:

int FUNCTION(MPI_Example)(/* соответствующие args */) { /* полезное содержание */ }

Тот же самый исходный файл может затем быть скомпилирован, чтобы создать обе версии библиотеки в зависимости от состояния макро символа PROFILELIB.

Требуется, чтобы стандарт библиотеки MPI был построен таким образом, что включение функций MPI происходило по одной за один раз. Это неприятное требование, поскольку подразумевается, что каждая внешняя функция должна компилироваться из отдельного файла. Однако это необходимо для того, чтобы автор профилирующей библиотеки определял только те функции MPI, которые он хочет перехватить, ссылки на любые другие функции выполняются стандартной библиотекой MPI. Следовательно, этап компановки может выглядеть примерно так:

% cc ... -lmyprof -lpmpi -lmpi

Здесь libmyprof.a включает профилирующие функции , которые перехватывают некоторые функций из MPI. libpmpi.a содержит смещенные имена функцийMPI и libmpi.a содержит нормальные определение функций MPI.



Alex Otwagin 2002-12-10