cygwin - 如何在 Cygwin 下使 OpenMP 与 MinGW-64 一起工作?

标签 cygwin 64-bit openmp gcc4 mingw-w64

情景

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

当我使用 32 位版本的 gcc 时,某处出现了可怕的错误,应用程序比非常粗糙的单线程版本慢了大约 60 倍,而实际上它应该比 CPU 的数量更快.它使它无法使用。我真的不知道是什么导致了这种情况;无论如何,我决定改用 64 位版本的 MinGW,即 x86_64-w64-mingw32-gcc-4.5.3和他的 friend ,准确地说。

旁注:我确信速度减慢不是我的多线程中的缺陷,多线程应用程序在 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 编译的switch,我相信这也应该是非常有可能的。

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

最佳答案

我认为“加载共享库时出错:?:”意味着 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 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 共享运行时)
  • 关于cygwin - 如何在 Cygwin 下使 OpenMP 与 MinGW-64 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13423955/

    相关文章:

    c++ - 使用 omp 生成矩阵会导致麻烦,不同的 columsizes

    c - 与单独使用 OpenMP 相比,混合 OpenMP/MPI 的运行时间更慢

    windows - 在 Vim for Windows 上设置 Cygwin shell 路径

    haskell - 如何在 Cygwin 下安装 Haskell readline?

    delphi - 使用默认排序在 64 位与 32 位中对 TList<TPair<Integer,integer>> 进行排序

    c - 使用 fgets 随机读取非常大的文件似乎会使 Windows 缓存达到极限

    c - 为什么我的程序在嵌套时会生成随机结果?

    c++ - 无法在 Windows 上安装最新的 GCC

    android - 带有 cygwin 的 Windows 7 中的 repo 初始化错误

    assembly - 为什么我不能将 64 位值 MOV 到 64 位寄存器?