OpenACC - отсутствует блок области конечных данных - PullRequest
0 голосов
/ 15 ноября 2018

При компиляции с

появляется ошибка «Отсутствует конечный блок области данных»

pgc ++ -mp -ta = tesla: cuda9.1 -Minfo = accel figure.cpp mesh.cpp main.cpp

У меня есть эта программа, и я использую PGI 18.4

//////////////////figure.h
#include <iostream>
class figure;
typedef double(figure::*FuncPtr)(double, double);
class figure
{
    public:
    figure(void);
    ~figure(void);
    #pragma acc routine seq
    double sum(double u, double v);
};
//////////////////figure.cpp
#include "figure.h"
figure::figure(void)
{
    #pragma acc enter data create(this)
}
figure::~figure(void)
{
    #pragma acc exit data delete(this)
}
double figure::sum(double u, double v)
{
return u + v;   
}
//////////////////mesh.h
#include "figure.h"
class Mesh{
public:
    double u,v;
    figure* m_Figure;
    #pragma acc routine seq
    void SetFun(void);
    void get();
    Mesh();
    ~Mesh();
};
//////////////////mesh.cpp
#include "mesh.h"
FuncPtr X;
#pragma omp threadprivate(X)
Mesh::Mesh(void)
{
    #pragma acc enter data create(this)
    #pragma acc enter data create(m_Figure[0:1])
}
Mesh::~Mesh(void)
{   
    #pragma acc exit data delete(m_Figure[0:1])
    #pragma acc exit data delete(this)
}
void Mesh::SetFun(void)
{
X = &figure::sum;
}
void Mesh::get(void)
{   
    int N = 5;
    Mesh ObjNew;
    ObjNew.u = 23;
    ObjNew.v = 48;
    ObjNew.SetFun();
    std::cout << (m_Figure->*X)(ObjNew.u,ObjNew.v) << std::endl;
    #pragma acc parallel loop copyin(N) copy(ObjNew,m_Figure[0:1]) private(X)
    {
        for (int i = 0; i < N; i++)
        {
            ObjNew.SetFun();
            (m_Figure->*X)(i*i,i);
        }
    }
}
//////////////////main.cpp
#include "mesh.h"
int main(){
    Mesh Obj;
    Obj.get();
    return 0;
}

Так что проблема в typedef? Или может что-то еще? Я также пытаюсь скомпилировать с опцией -Minfo = all, но ничего нового о проблеме не получаю.

...