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
,