2016-01-27 2 views
1

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

  • Я использую OpenBabel, который имеет зависимость от Eigen.
  • Я попытался с помощью #pragma согла ядра
  • Я попытался с помощью #pragma согласно рутина
  • Моей команды компиляции: «PGC++ -acc -т = тесла -Minfo = все -I/дома/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-Procedures called in a compute region must have acc routine information: OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double) (main.cpp: 66) 
PGCC-S-0155-Accelerator region ignored; see -Minfo messages (main.cpp) 
bondRot::two(std::vector>, OpenBabel::OBMol, int, OpenBabel::OBMol): 
    11, include "bondRot.h" 
      0, Accelerator region ignored 
      66, Accelerator restriction: call to 'OpenBabel::OBMol::SetTorsion(OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, OpenBabel::OBAtom *, double)' with no acc routine information 
PGCC/x86 Linux 15.10-0: compilation completed with severe errors

ПРИМЕЧАНИЕ: строкой 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, я получил идею, что это ошибка, которая происходит из-за «задней зависимости» от моль (Объект OBMol). Если кто-нибудь знает решение для него, пожалуйста, помогите мне.

ответ

0

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

В качестве альтернативы вы можете попробовать выполнить эти процедуры.

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

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

Надеется, что это помогает, Мату

+0

Благодаря мат, я добавил #pragma согла рутина библиотек и эти ошибки теперь исправлено. Но я хотел спросить, есть ли способ, которым я могу использовать std :: string на CUDA? –

+0

Я не эксперт CUDA, поэтому не знаю точно, но я не верю, что CUDA поддерживает std :: string. Я просмотрел документы Thrust и Kokkos, которые часто используются как альтернативы std :: vector, но ничего не видели о std :: string. –

Смежные вопросы