2017-12-04 13 views
0

OpenMPで並列化されているソルバーと比較しようとしています。ソルバーはすべて、Fixed Form Fortran 77を使用してOpenMPIで並列実行されています。 mpif77では、オブジェクトファイルを-fopenmpスイッチとリンクさせることはできません。 Makeは実行可能ファイルを作成しません。私はOpenMPソースファイルをgfortranと別々にコンパイルしようとしてから、mpif77とリンクしようとしました - うまくいきません。私はスイッチを使用しない場合には、一般的なエラーがスローされます。OpenMPIでOpenMPを使用してMPIプログラムをコンパイルできない

Undefined symbols for architecture x86_64: 
    "_GOMP_parallel", referenced from: 
     _parmatdiff_ in matdiff.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [solvercomp] Error 

私の質問はありませんOpenMPIのサポートOpenMPのではいた場合、どのように私はリンクが機能に作成したオブジェクトファイルを「作る」ことを保証しますOpenMPライブラリでは?ここで

私のメイクファイルのコピーです:

SOURCES = solvcomp.f matdiff.f seqjacobi.f seqconjgrad.f parsor.f 
FCC = mpif77 
MPIRUN = mpirun 
OBJECTS = $(SOURCES:.f=.o) 
TARGET = soln 
FFLAGS = -o 
CFLAGS = -c 
NP = 4 

all: $(TARGET) clean 

$(TARGET): $(OBJECTS) 
     $(FCC) $(FFLAGS) $(TARGET) $(OBJECTS) 

$(OBJECTS): $(SOURCES) 
     $(FCC) $(CFLAGS) $(SOURCES) 

clean: 
    rm -rf *.o *.dSYM 
+0

Open MPIのどのバージョンを使用していますか? 'mpif77 -fopenmp'で生成されたエラーを投稿できますか? –

+0

OpenMPIは多くのMPI実装のうちの1つに過ぎず、OpenMPは標準であることに注意してください。だから2つの非常に異なるもの。もっと詳しく知る必要があります([ask]参照)。どのバージョンを使用していますか? 'mpif77 -v'は何を印刷しますか? 'make 'によって最後に実行されたコマンドはどのように見えますか? 'make'の完全な出力はどのように見えますか? –

+0

また、「mpif77でオブジェクトファイルを-fopenmpスイッチにリンクさせることができません」というときにはどうなりましたか?詳細、詳細、詳細が必要ですか?エラーメッセージはありますか?どのコマンランドが実行するのですか? *完全な出力は何ですか?エラーメッセージはありますか?あなたはどこのフラグをMakefileに入れましたか? –

答えて

0

あなたのリンクコマンドが

mpif77 -o -fopenmp a.out foo.o 

はあなたのLDFLAGS-oはかなり最初の場所で台無しに見えた、私の知る限りは心配として

LDFLAGS='-fopenmp -o' 

を試してみてください偽です。

+0

これは問題を解決しました。副次的な質問 - フラグの重要性は重要ですか? –

+0

'-o a.out -fopenmp'または' -fopenmp -o a.out'の両方がうまくいきます。 'a.out'が' -o'の後にある限り、 'LDFLAGS'に' -o'を付けています。エラーが発生しやすいので、非常に慣習的ではありません。 –

+0

@HimakarGanti質問を編集してください。それは本当に重要です。重要な情報がなければ役に立たない。書式設定がすべて間違っているため、コメントからコピーすることはできません。 –

0

OpenMPIのコンパイラmpicc|mpic++|mpif70|...基本的にランタイムで必要なヘッダとリンクを含めるために必要な適切なフラグとバックエンドコンパイラを呼び出すプログラムでありますとしょうかん。

フラグ-showmeを追加すると、使用しているコンパイラを確認することができます。 OpenMPは標準ですが、コンパイラは異なるフラグを使用して、プログラムがOMP構成を解釈し、OpenMPランタイムライブラリとリンクする必要があることを示している場合があります。リンクコマンドに-showme:linkを追加すると、バックエンドのFortranコンパイラにどのオプションが渡されているかを確認できます。

MPIとOpenMPは、一般的に一緒に使用される2つの並列プログラミングモデルであるため、プログラムでは問題はありません。

https://www.open-mpi.org/doc/v2.0/man1/mpicc.1.php

+1

さて、OPは何が間違っているのですか?どのように彼は彼のMakefileを修正する必要がありますか? –

+0

エラーメッセージは、ソースファイルをコンパイルするために '-fopenmp'が使用されたことを示しますが、オブジェクトファイルをリンクするときは省略されました。本当の疑問は「 '-fopenmp'フラグでリンクするとどうなりますか?」です。これまでに、私たちが得たものは、「役に立たない、助けてください!」というものでした。これはかなり無駄です。 –

+0

OpenMPIとOpenMPは最新のリリースです。ステージをリンクするための-fopenmpフラグを省略すると、上記のエラーがスローされます。それを追加すると、次のエラーが表示されます。mpif77 -c -fopenmp solvcomp.f matdiff.f seqjacobi.f seqsor.f parsor.f mpif77 -o -fopenmp solvcomp solvcomp.o matdiff.o seqjacobi.o seqsor.o parsor .o gfortran:エラー:solvcomp:そのようなファイルやディレクトリがありません。 make:*** [solvcomp] Error 1 –

関連する問題