METIS: разные результаты на разных ОС

Эта программа на C вызывает METIS для разбиения меша.

Изменить: Новая версия программы на C с учетом комментариев WeatherVane и PaulOgilvie.

На моем GNU/Linux Я получаю результаты:

objval: 14
epart: 0 0 0 0 0 1 2 2 1 0 0 1 2 2 1 2 2 1 
npart: 0 0 0 2 0 0 1 1 2 2 2 1 2 2 1 1 
8

пока на моем OSX Я получил:

objval: 17
epart: 0 1 1 0 1 0 2 2 0 1 1 1 2 2 1 2 2 0 
npart: 0 1 1 1 0 1 0 1 2 2 2 0 2 2 0 0 
8

Что заставляет результаты отличаться?

Как это исправить, я имею в виду, всегда получать одинаковые результаты независимо от того, какая ОС / архитектура / компилятор?

Замечания: idx_t является int64_t, который long на моем GNU/Linux, но long long на моем OSX,

Мой GNU/Linux

$ cat /etc/issue
Ubuntu 12.04.4 LTS \n \l

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ uname -s -r -v -p -i -o
Linux 3.5.0-45-generic #68~precise1-Ubuntu SMP Wed Dec 4 16:18:46 UTC 2013 x86_64 x86_64 GNU/Linux

Мой OSX

$ sw_vers 

ProductName:    Mac OS X
ProductVersion: 10.9.5
BuildVersion:   13F34

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

$ uname -m -p -r -s -v
Darwin 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64 i386

METIS установка

METIS версия 5.1.0

Я установил METIS с миниконд.

Пакеты здесь(файлы linux-64/metis-5.1.0-0.tar.bz2 а также osx-64/metis-5.1.0-2.tar.bz2).

Эти пакеты были построены по этому рецепту.

1 ответ

Решение

METIS использовать псевдослучайные числа.

Псевдослучайные числа генерируются GKlib функции. (GKlib встроен внутри METIS tarbarlls).

По умолчанию, GKlib использует rand функция из стандартной библиотеки C, которая может генерировать различное число на разных платформах. (см.: Согласованные псевдослучайные числа на разных платформах).

Но GKlib также может быть скомпилирован с флагом -DUSE_GKRAND, Вместо использования rand Функция, она использует свою собственную, которая всегда дает одинаковые случайные числа разных пластин.

Компилирование с -DUSE_GKRAND C код в функции дают те же результаты на моем GNU/Linux и на моем OSX:

objval: 18
epart: 0 0 0 2 1 1 2 2 1 0 0 1 0 1 1 2 2 1 
npart: 0 0 0 0 2 0 1 1 2 1 2 1 2 2 1 1 
8

Я использовал этот рецепт Конда, чтобы построить METIS,

Другие вопросы по тегам