При компиляции с
появляется ошибка «Отсутствует конечный блок области данных»
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, но ничего нового о проблеме не получаю.