Как заставить OpenMP работать с MinGW-64 под Cygwin?

Сценарий

Я разрабатываю приложение на C99 ANSI C, которое использует OpenMP и GMP. Его естественной средой обитания будет Linux-машина с большим количеством ядер, так что особых проблем здесь нет, но по причинам, которые я не хочу обсуждать здесь, я должен разрабатывать под Cygwin на 64-битной Windows-машине.

Когда я использую 32-битную версию gcc, что-то где-то идет ужасно неправильно, и приложение работает примерно в 60 раз медленнее, чем очень грубая однопоточная версия, хотя на самом деле оно должно быть быстрее на коэффициент, равный количеству процессоров. . С ним невозможно работать. Я действительно не знаю, что вызывает это; В любом случае, я решил вместо этого использовать 64-битную версию MinGW, а именно x86_64-w64-mingw32-gcc-4.5.3 и его друзей, если быть точным.

Примечание: я уверен, что замедление не является недостатком моей многопоточности, многопоточное приложение работает корректно и быстрее на Linux-машине.

Актуальная проблема

Настроить GMP было легко, его можно без проблем скомпилировать из исходного кода, а затем он работает как шарм. Компиляция следующего простого примера с -fopenmp также работает как шарм:

#include <gmp.h>
#include <omp.h>

int main() {
    #pragma omp parallel
    {
        mpz_t t;
        mpz_init(t);
        mpz_set_si(t,omp_get_thread_num());
        # pragma omp critical
        { 
            gmp_printf("Hello From GMP'd Thread %Zd!\n",t); 
            fflush(stdout);
        }
        mpz_clear(t);
    }
    return 0;
}

Однако его выполнение дает мне

$ ./test
test.exe: error while loading shared libraries: ?:
cannot open shared object file: No such file or directory

Мне известно об этом вопросе, но я хотел бы, чтобы эта работа работала без загрузки других двоичных файлов чем из официального репозитория Cygwin. Поскольку мой пример скомпилирован с переключателем -fopenmp, я убежден, что это также вполне возможно.

Может ли кто-нибудь помочь мне с этим? Большое спасибо заранее.


person Jesko Hüttenhain    schedule 16.11.2012    source источник
comment
Работает ли это при статической привязке к -static?   -  person Hristo Iliev    schedule 17.11.2012
comment
Выдает мне точно такое же сообщение об ошибке.   -  person Jesko Hüttenhain    schedule 17.11.2012
comment
Это может быть ошибка компилятора или компоновщика, учитывая имя ?. Не могли бы вы попробовать получить более новую сборку GCC?   -  person Hristo Iliev    schedule 17.11.2012
comment
Я уже обновил Cygwin, так что это должна быть последняя сборка.   -  person Jesko Hüttenhain    schedule 18.11.2012
comment
Ладно, не хочешь это обсуждать. Тем не менее, позвольте мне спросить, почему Cygwin. У меня есть довольно безупречный опыт работы с MSys и MinGW-w64 (сборка TDM) с использованием интерфейса командной строки Console2. Используя эту комбинацию, openmp также работает как шарм.   -  person FFox    schedule 18.11.2012


Ответы (1)


Я думаю, что «ошибка при загрузке разделяемых библиотек: ?:» означает, что cygwin не знает, где найти libgmp-10.dll и/или libgomp-1.dll.

Обе DLL требуются в соответствии с Dependency Walker.

dll


Ваша программа заработала после того, как я добавил директорию, содержащую обе DLL, в мой PATH:

#$ x86_64-w64-mingw32-g++ -fopenmp -o w64test gmp_hello.c -lgmp
#$ file ./w64test.exe
./w64test.exe: PE32+ executable (console) x86-64, for MS Windows

#$ ./w64test.exe
/home/david/SO/hello_openmp/w64test.exe: error while loading shared
 libraries: ?: cannot open shared object file: No such file or
 directory

#$ ls /cygdrive/c/dev/cygwin/usr/x86_64-w64-mingw32/sys-root/mingw/bin/*mp*dll

/cygdrive/c/dev/cygwin/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libgmp-10.dll
/cygdrive/c/dev/cygwin/usr/x86_64-w64-mingw32/sys-root/mingw/bin/libgomp-1.dll

#$ export PATH=$PATH:/cygdrive/c/dev/cygwin/usr/x86_64-w64-mingw32/sys-root/mingw/bin/

#$ ./w64test.exe
Hello From GMP'd Thread 1!
Hello From GMP'd Thread 0!

примечание

Я скомпилировал и установил gmp-5.0.5 с помощью следующих команд:

./configure --build=i686-pc-cygwin --host=x86_64-w64-mingw32 --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw  --enable-shared --disable-static
make -j 2
make check
make install


обновить

Ваша программа также работает с cygwin "Компилятор GCC Release Series 4".

#$ g++ -fopenmp -o cygtest gmp_hello.c -lgmp
#$ ./cygtest.exe
 Hello From GMP'd Thread 1!
 Hello From GMP'd Thread 0!

#$ g++ -v
 Target: i686-pc-cygwin
 Thread model: posix
 gcc version 4.5.3 (GCC)

Вам может потребоваться установить следующие пакеты:

  • libgmp-devel (библиотека разработки для GMP)
  • libgmp3 (библиотека времени выполнения для GMP)
  • libgomp1 (общая среда выполнения GOMP)
person David L.    schedule 19.11.2012
comment
Это идеально! Проблема не в том, чтобы найти DLL. Кроме того, родное 64-битное приложение с многопоточностью теперь работает быстрее, чем однопоточная версия! Большое спасибо за этот замечательный, очень подробный ответ. - person Jesko Hüttenhain; 19.11.2012