コードをグラフィカルに高速化するために、PGC++ でコードを開発しています。
- Eigen に依存する OpenBabel を使用しています。
- #pragma acc kernel を使ってみた
- #pragma acc ルーチンを使用してみました
- 私のコンパイル コマンドは次のとおりです。 pranav/new_installed/lib/openbabel/main.cpp/home/pranav/new_installed/lib/libopenbabel.so"
次のエラーが表示されます
PGCC-S-0155 - 計算領域で呼び出されるプロシージャには、acc ルーチン情報が必要です: OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double) (main.cpp: 66) PGCC-S-0155 - アクセラレータ領域が無視されました。-Minfo メッセージ (main.cpp) を参照してください。 bondRot::two(std::vector>, OpenBabel::OBMol, int, OpenBabel::OBMol): 11、「bondRot.h」を含める 0、アクセラレータ領域は無視されます 66、アクセラレータの制限: acc ルーチン情報なしで 'OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double)' を呼び出す PGCC/x86 Linux 15.10-0: コンパイルが重大なエラーで完了しました
注: 66 行目は「mol.SetTorsion(a[0],a[1],a[2],a[3],i*(3.14159265358979323846/180));」です。以下の貼り付けられたボードで。
このエラーを表示している私のコードは次のとおりです。
#pragma acc routine
public:bool two(vector<OBAtom *> a)
{
std::ostringstream bestanglei,bestanglej;
for(unsigned int i=0;i<=360;i=i+res)
{
for(unsigned int j=0;j<=360;j=j+res)
{
mol.SetTorsion(a[0],a[1],a[2],a[3],i*(3.14159265358979323846/180));
//cout<<i<<"\n";
}
}
return true;
}
Googleでの一次検索から、これはmol(OBMolオブジェクト)の「後方依存」のために発生しているエラーであることがわかりました。誰かがそれに対する解決策を知っているなら、私を助けてください。