【问题标题】:How to make OpenMP work with MinGW-64 under Cygwin?如何使 OpenMP 在 Cygwin 下与 MinGW-64 一起工作?
【发布时间】:2012-11-16 20:29:20
【问题描述】:

情景

我正在用 C99 ANSI C 开发一个使用 OpenMPGMP 的应用程序。它的自然栖息地将是一个内核很多的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 开关编译,我相信这也应该是非常可能的。

有人可以帮我吗?提前致谢。

【问题讨论】:

  • -static静态链接时是否有效?
  • 给了我完全相同的错误信息。
  • 在给定名称 ? 的情况下可能是编译器或链接器错误。您能尝试获得更新的 GCC 版本吗?
  • 我已经更新了 cygwin,所以这应该是最新的版本。
  • 好吧,你不想讨论它。不过,请允许我问为什么 Cygwin。我在这里使用 Console2 命令行界面对 MSys 和 MinGW-w64(TDM 构建)有一些非常完美的体验。使用这种组合,openmp 也能像魅力一样工作。

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


【解决方案1】:

我认为“加载共享库时出错:?:”意味着 cygwin 不知道在哪里可以找到 libgmp-10.dll 和/或 libgomp-1.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 compiler”。

#$ 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 共享运行时)

【讨论】:

  • 太完美了!找不到 DLL 正是问题所在。此外,带有线程的本机 64 位应用程序现在比单线程版本运行得更快!非常感谢您提供的这个很棒、非常详细的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2021-06-07
  • 2016-05-29
  • 2010-09-27
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多