如何使OpenMP在Cygwin下与MinGW-64一起工作? 情景
我正在用C99 ANSI C开发一个应用程序,它使用和。它的自然栖息地将是一台拥有大量内核的linux机器,因此基本上没有什么大问题,但出于我不想在这里讨论的原因,我必须在64位Windows机器上使用Cygwin进行开发 当我使用32位版本的gcc时,某个地方出现了可怕的错误,应用程序的速度大约是非常粗糙的单线程版本的60倍,而事实上它的速度应该是CPU数量的一倍。这使得我们无法合作。我真的不知道是什么原因造成的;无论如何,我决定改用64位版本的MinGW,确切地说是x86_64-w64-mingw32-gcc-4.5.3和他的朋友 一个旁注:我确信减速并不是我的多线程处理中的一个缺陷,多线程应用程序在linux机器上正确且快速地工作 实际问题 建立GMP很容易,它可以从源代码编译而不费吹灰之力,然后像一个魔咒一样工作。使用如何使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
-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