Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使OpenMP在Cygwin下与MinGW-64一起工作? 情景_Cygwin_64 Bit_Openmp_Gcc4_Mingw W64 - Fatal编程技术网

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

如何使OpenMP在Cygwin下与MinGW-64一起工作? 情景,cygwin,64-bit,openmp,gcc4,mingw-w64,Cygwin,64 Bit,Openmp,Gcc4,Mingw W64,我正在用C99 ANSI C开发一个应用程序,它使用和。它的自然栖息地将是一台拥有大量内核的linux机器,因此基本上没有什么大问题,但出于我不想在这里讨论的原因,我必须在64位Windows机器上使用Cygwin进行开发 当我使用32位版本的gcc时,某个地方出现了可怕的错误,应用程序的速度大约是非常粗糙的单线程版本的60倍,而事实上它的速度应该是CPU数量的一倍。这使得我们无法合作。我真的不知道是什么原因造成的;无论如何,我决定改用64位版本的MinGW,确切地说是x86_64-w64-mi

我正在用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;
}
我知道,但我想在不下载任何二进制文件的情况下完成这项工作,而只从官方Cygwin存储库下载二进制文件。由于我的示例是使用
-fopenmp
开关编译的,因此我相信这也应该是非常可能的

有人能帮我吗?我想“加载共享库时出错:?:”意味着cygwin不知道在哪里可以找到
libgmp-10.dll
和/或
libgomp-1.dll

这两个DLL都是必需的


在我将包含这两个DLL的目录添加到我的
路径
后,您的程序运行正常:

#$x86_64-w64-mingw32-g++-fopenmp-o w64test gmp\u hello.c-lgmp
#$file./w64test.exe
./w64test.exe:PE32+可执行文件(控制台)x86-64,适用于MS Windows
#$./w64test.exe
/home/david/SO/hello\u openmp/w64test.exe:加载共享时出错
库:?:无法打开共享对象文件:没有此类文件或
目录
#$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
您好,来自GMP'd线程1!
您好,来自GMP'd线程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-j2
核对
安装

更新

您的程序还可以与cygwin“GCC发行版系列4编译器”配合使用

#$g++-fopenmp-o cygtest gmp\u hello.c-lgmp
#$./cygtest.exe
您好,来自GMP'd线程1!
您好,来自GMP'd线程0!
#$g++-v
目标:i686 pc cygwin
线程模型:posix
gcc版本4.5.3(gcc)
您可能需要安装以下组件:

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

当使用
-static
进行静态链接时,它是否工作?给出了完全相同的错误消息。如果名称为
,则可能是编译器或链接器错误。你能试着得到一个更新的GCC版本吗?我已经更新了cygwin,所以这应该是最新的版本了。好吧,你不想讨论它。不过,请允许我问一下为什么是Cygwin。我在MSys和MinGW-w64(TDM构建)使用Console2命令行界面方面有一些非常完美的经验。使用这种组合,openmp也能像魅惑一样工作。这太完美了!找不到DLL正是问题所在。此外,本机64位线程应用程序现在运行速度比单线程版本快!非常感谢您的回答,非常详细。
$ ./test
test.exe: error while loading shared libraries: ?:
cannot open shared object file: No such file or directory