Mam dziwny problem z programem. Otóż jeżeli kompiluję jego z optymalizacjami dla CPU i O3 to wykonuje się teoretycznie poprawnie. W przypadku gdy kompiluję bez optymalizacji CPU i z O2 podczas uruchamiania dostaję "Segmentation fault".
Program można pobrać z repozytorium googlecode:
svn checkout http://olib.googlecode.com/svn/trunk/ olib
Następnie należy wejść do odpowiedniego katalogu z przykładami:
cd olib/samples
I wykonać odpowiednie polecenie make:
make goldbach_odd
Po kompilacji program będzie znajdował się w podkatalogu mathematics, który znajduje się w katalogu samples.
cd mathematics
Wystarczy uruchomić program odpowiednią dość długą komendą:
time env OMP_NUM_THREADS=2 ./goldbach_odd 100000000209366024193 10000000000000000000000
i program powinien zwrócić Segmentation fault.
Można spróbować dodać optymalizacje CPU w pliku makefile (olib/samples/makefile). Odpowiada za to 71 linijka:
CPU_OPTYMALIZATION = no
Próbowałem debugować programem gdb. Udało mi się jednak uzyskać tylko:
Program received signal SIGSEGV, Segmentation fault.
0x000000000041de43 in __gmpz_set_str ()
Nic mi to nie mówi. Błąd z pewnością jest w sekcji OPenMP w pliku olib/samples/mathematics/goldbach_odd.cpp
#pragma omp parallel shared(S, add_1, add_2, number_of_threads) private(thread_id, number, upper_range, counter)
{
}
Błąd jest jednak niezależny od ilości wątków na których będzie wykonywany program - występuje nawet gdy program uruchomimy na jednym wątku.
Czy ktoś mógłby pomóc i zrobić porządne debugowanie tego programu?