Параллельные ядра OpenACC не генерируются

Я разрабатываю код на PGC ++ для графического ускорения кода.

  • Я использую OpenBabel, которая имеет Eigen зависимость.
  • Я пытался использовать #pragma acc kernel
  • Я пробовал использовать #pragma acc рутина
  • Моя команда компиляции: «pgc ++ -acc -ta = tesla -Minfo = all -I / home / pranav / new_installed / include / openbabel-2.0 / -I / home / pranav / new_installed / include / eigen3 / -L / home / pranav / new_installed / lib / openbabel / main.cpp /home/pranav/new_installed/lib/libopenbabel.so «

Я получаю следующую ошибку

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). Если кто-нибудь знает решение для этого, пожалуйста, помогите мне.

1

Решение

Чтобы вызывать подпрограмму из кода устройства, она должна быть доступной версией подпрограммы устройства. В этом случае компилятор не может найти его для подпрограммы «OpenBabel :: OBMol :: SetTorsion». Вам нужно будет добавить директиву #pragma acc рутина в прототип и определение этой рутины библиотеки, а затем скомпилировать библиотеку с PGI и «-acc». Любая подпрограмма, которую может вызвать SetTorsion, также потребует версий устройства.

Кроме того, вы можете попытаться встроить эти процедуры.

Обратите внимание, что у вас будут проблемы при попытке записи в поток ввода-вывода и файлы из кода устройства. Доступна только ограниченная поддержка неформатированного стандартного вывода, когда выходные данные всех потоков буферизуются, передаются обратно на хост, а затем печатаются ОС.

У вас также будут проблемы с использованием STL :: Vector. Помимо того, что они не являются поточно-ориентированными, агрегированные типы данных с динамическими элементами данных еще не поддерживаются в OpenACC. Существуют способы обработки этих структур, если вы хотите управлять данными в самой структуре или использовать унифицированную память CUDA (-ta = tesla: managed). Если вам интересно, я выступил с докладом на эту тему на GTC2015, который вы можете просмотреть по адресу: https://www.youtube.com/watch?v=rWLmZt_u5u4

Надеюсь это поможет,
Мат

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]