I am trying to overload a simple parenthesis in the following class
class MyClass{
private:
double *P;
// some code to allocate required variables on the device on the device
#pragma acc routine
public:
double &operator()( int i, int j, int k );
}
// constructor
MyClass::MyClass( int n )
{
N = n;
P=new double[N*N*N];
for(int i=0;i<N*N*N;i++)
{
P[i]=0.0;
}
#pragma acc enter data create(this[0:1])
#pragma acc enter data create(P[0:N*N*N])
#pragma acc update device(this)
}
#pragma acc routine
double& MyClass::operator()(int i, int j,int k)
{
// some assertion to catch bugs
//
return P[i+N*j+N*N*k];
}
int main()
{
MyClass P1;
// using a very simple assignment
#pragma acc kernels
#pragma acc loop
for ( int i = 0; i < N; i++ )
{
#pragma acc loop
for ( int j = 0; j < N; j++ )
{
#pragma acc loop
for ( int k = 0; k < N; k++ )
{
P1( i, j, k )=2.0 ;
}
}
}
}
//编译器错误: 238,生成隐式副本(P1) 244,复杂循环携带依赖性阻止并行化 生成加速器标量内核 生成加速器内核 生成特斯拉代码 244,#pragma acc loop seq 247,#pragma acc loop seq 250,#pragma acc loop seq 247,复杂循环携带依赖性防止并行化 250,复杂循环携带依赖性阻止并行化
传递引用是否与此有关?
答案 0 :(得分:1)
使用&#34;内核&#34;构造,编译器必须证明循环在它可以并行化之前不包含任何依赖关系。这里有一个函数调用类方法来更新数据。由于它不知道该方法正在做什么(它可能将每次迭代映射到数组中的相同元素),因此它必须假设可能存在依赖。
这里有几个选项: