Я разрабатываю код на PGC ++ для графического ускорения кода.
Я получаю следующую ошибку
PGCC-S-0155-процедуры, вызываемые в вычислительной области, должны иметь соответствующую информацию о рутине: 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, ограничение акселератора: вызов '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). Если кто-нибудь знает решение для этого, пожалуйста, помогите мне.
Чтобы вызывать подпрограмму из кода устройства, она должна быть доступной версией подпрограммы устройства. В этом случае компилятор не может найти его для подпрограммы «OpenBabel :: OBMol :: SetTorsion». Вам нужно будет добавить директиву #pragma acc рутина в прототип и определение этой рутины библиотеки, а затем скомпилировать библиотеку с PGI и «-acc». Любая подпрограмма, которую может вызвать SetTorsion, также потребует версий устройства.
Кроме того, вы можете попытаться встроить эти процедуры.
Обратите внимание, что у вас будут проблемы при попытке записи в поток ввода-вывода и файлы из кода устройства. Доступна только ограниченная поддержка неформатированного стандартного вывода, когда выходные данные всех потоков буферизуются, передаются обратно на хост, а затем печатаются ОС.
У вас также будут проблемы с использованием STL :: Vector. Помимо того, что они не являются поточно-ориентированными, агрегированные типы данных с динамическими элементами данных еще не поддерживаются в OpenACC. Существуют способы обработки этих структур, если вы хотите управлять данными в самой структуре или использовать унифицированную память CUDA (-ta = tesla: managed). Если вам интересно, я выступил с докладом на эту тему на GTC2015, который вы можете просмотреть по адресу: https://www.youtube.com/watch?v=rWLmZt_u5u4
Надеюсь это поможет,
Мат
Других решений пока нет …