如何让OpenMP在Cygwin下使用MinGW-64?

时间:2012-11-16 20:29:20

标签: cygwin 64-bit openmp gcc4 mingw-w64

情景

我正在开发一个使用OpenMPGMP的C99 ANSI C的应用程序。它的自然栖息地将是一台拥有大量核心的linux机器,因此基本上没有大问题,但由于我不想在这里辩论的原因,我必须在64位Windows机器上使用Cygwin进行开发。

当我使用32位版本的gcc时,某些地方出现了可怕的错误,并且应用程序比非常粗糙的单线程版本慢了大约60倍,而事实上它应该比一个等于CPU的数量。这使得无法使用。我真的不知道造成这种情况的原因;无论如何,我决定使用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

我知道this question,但我想在没有下载任何二进制文件的情况下完成这项工作,而不是官方的Cygwin存储库。由于我的示例使用-fopenmp开关编译,我相信这也应该是非常可能的。

有人可以帮我吗?先谢谢了。

1 个答案:

答案 0 :(得分:2)

我认为“加载共享库时出错:?:”表示cygwin不知道在哪里找到libgmp-10.dll和/或libgomp-1.dll

根据Dependency Walker

,这两个DLL都是必需的

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)

您可能需要安装以下packages

  • libgmp-devel(GMP开发库)
  • libgmp3(GMP的运行时库)
  • libgomp1(GOMP共享运行时)