【发布时间】:2012-11-16 20:29:20
【问题描述】:
情景
我正在用 C99 ANSI C 开发一个使用 OpenMP 和 GMP 的应用程序。它的自然栖息地将是一个内核很多的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