next up previous contents
Next: HPUX Up: Программы завершаются с ошибкой Previous: Программы завершаются с ошибкой   Contents

Общие

  1. В: Я использую MPI_Allreduce, и получаю различные результаты в зависимости от числа используемых процессов.

    О: Коллективные процедуры MPI могут использовать ассоциативность для достижения лучшего параллелизма. Например,

    MPI_Allreduce ( &in, &out, MPI_DOUBLE, 1, ... );
    может вычислять
    $( ( ( ( ( ( (a + b) + c) + d) + e) + f) + g) + h)$
    или может вычислять
    $( (a + b) + (c + d)) + ( (e + f) + (g + h))$
    где a, b, ... - значения in в каждом из восьми процессов. Эти выражения эквивалентны для целых, вещественных и других привычных объектов из математики, но не эквивалентны для типов данных, таких, как данные с плавающей точкой, используемых в компьютерах. Ассоциация, которую использует MPI, зависит от количества процессов, таким образом, Вы можете не получить тот же самый результат при использовании различного числа процессов. Отметьте, что Вы не получите неверный результат, а просто другой (большинство программ предполагают, что арифметические операции ассоциативны).
  2. В: Компилятор Фортрана завершается с ошибкой BUS.

    О: Компилятор С, с помощью которого был построен mpich и компилятор Фортрана, который Вы используете, имеют различные правила выравнивания для таких вещей, как DOUBLE PRECISION (двойная точность). Например, GNU C компилятор gcc может предположить, что все значения double выравниваются по 8-байтовой границе, а язык Фортран требует только такого выравнивания DOUBLE PRECISION для INTEGER, которое делается по 4-байтовой границе.

    Хорошего решения не существует. Рассмотрим перестроение mpich с компилятором С, который поддерживает слабые правила выравнивания данных. Некоторые компиляторы Фортрана позволяют Вам задать 8-байтовое выравнивание для DOUBLE PRECISION (например, опции -dalign в -f некоторых компиляторах Фортрана для Sun); заметьте, однако, что это может испортить некоторые корректные программы Фортрана, взломав правила ассоциации хранения в Фортране.

    Некоторые версии gcc могут поддерживать -munaligned-doubles; mpich должен быть перестроен с этой опцией, если Вы используете gcc версии 2.7 или выше. mpich пытается определить и использовать опцию, если она доступна.

  3. В: Я использую fork для создания нового процесса или создаю новый поток, а программа завершается с ошибкой.

    О: Реализация mpich не полностью совместима с потоками и не не поддерживает ни fork, ни создание нового процесса. Заметьте, что спецификация MPI полностью совместима с потоками, но от реализаций этого не требуется. На данный момент некоторые реализации поддерживают потоки, хотя это уменьшшает производительность реализации MPI (сейчас Вам нужно определить, нужен ли Вам захват потока, даже если захват и освобождение более дорогостоящие).

    Реализация mpich поддерживает вызов MPI_Init_thread; посредством этого вызова, нового для MPI-2, Вы можете определить, какой уровень поддержки потоков позволяет реализация MPI. Начиная с mpich версии 1.2.0 поддерживается только MPI_THREAD_SINGLE. Мы уверены, что версия 1.2.0 и выше поддерживает MPI_THREAD_FUNNELED, и некоторые пользователи используют mpich в этом режиме (особенно вместе с OpenMP), но мы недостаточно протестировали mpich в этом режиме. Будущие версии mpich будут поддерживать MPI_THREAD_MULTIPLE.

  4. В: Программы C++ выполняют глобальне деструкторы (или конструкторы) больше раз, чем нужно. Например:
    class Z $\lbrace$
    public:
    Z () $\lbrace$ cerr « "*Z" « endl; $\rbrace$
     Z () $\lbrace$ cerr « "+Z" « endl; $\rbrace$
    $\rbrace$;

    Z z;

    int main (int argc, char **argv) $\lbrace$
    MPI_Init (&argc, &argv);
    MPI_Finalize ();
    $\rbrace$
    при запуске с устройством ch_p4 на два процесса выполняет деструктор дважды для каждого процесса.

    О: Ряд процессов, запущенных перед MPI_Init или после MPI_Finalize не определяются ; Вы не можете полагаться на определенное поведение. В случае ch_p4 порождается новый процесс для обработки запросов соединения; он прекращается после окончания программы.

    Вы можете использовать контролирующий процесс в потоке с устройством ch_p4 или использовать вместо этого устройство ch_p4mpd. Заметьте, однако, что этот код непереносим, поскольку он полагается на поведение, которое не определяет стандарт MPI.



Alex Otwagin 2002-12-16