シナリオ
OpenMPとGMPを使用する C99 ANSI C でアプリケーションを開発しています。当然のように多くのコアを搭載した Linux マシンになるので、基本的に大きな問題はありませんが、ここで議論したくない理由から、64 ビット Windows マシンで Cygwin で開発する必要があります。
32 ビット バージョンの gcc を使用すると、どこかでひどく問題が発生し、実際には CPU の数に等しい係数で高速になるはずの非常に粗雑なシングル スレッド バージョンよりもアプリケーションが約 60 倍遅くなります。 . それは一緒に働くことを不可能にします。何が原因なのか本当にわかりません。とにかく、代わりに MinGW の 64 ビット バージョンを使用することにし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
この質問は承知しておりますが、公式の Cygwin リポジトリ以外のバイナリをダウンロードせずに動作させたいと考えています。私の例はスイッチでコンパイルされたので、-fopenmp
これも非常に可能であると確信しています。
誰かがそれを手伝ってくれますか?事前にたくさんありがとう。