如何使用 OpenACC 计算 Mandelbrot 集?
How to use OpenACC for computing the Mandelbrot set?
我正在尝试学习使用 OpenACC 并开始使用一个简单的代码来实现它来计算 Mandelbrot 集,但是我在编译代码时收到错误。
我找到了这个
OpenACC must have routine information error
并认为它在我的代码中很容易使用,但它似乎不起作用。
这些是我想使用 OpenACC 的例程,以及我尝试过的方法
#pragma acc parallel loop copyout(color)
for (int i=0;i<=n0x;i++)
{
Cx=Re_start+dx*i;
#pragma acc loop
for (int h=0;h<=n0y;h++)
{
Cy=Im_start+dy*h;
Zx1=0.;
Zy1=0.;
#pragma acc loop
for(int k=0;k<=n;k++ && mod<=4.)
{
Zx=Zx1*Zx1-Zy1*Zy1+Cx;
Zy=2*Zx1*Zy1+Cy;
Zx1=Zx;
Zy1=Zy;
mod=(Zx*Zx+Zy*Zy);
if(mod<=4.)
{
if(k==n)
color[i][h]=-1;
color[i][h]=k+1;
}
}
}
}
我收到错误(我正在使用 pgc++ -acc splot.cpp -Minfo=accel
进行编译)
PGCC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Unknown variable reference (splot.cpp: 48)
main:
48, Generating copyout(color[:][:])
Generating Tesla code
52, #pragma acc loop gang /* blockIdx.x */
59, #pragma acc loop seq
68, #pragma acc loop vector(128) /* threadIdx.x */
52, Accelerator restriction: scalar variable live-out from loop: color
59, Loop is parallelizable
Accelerator restriction: scalar variable live-out from loop: color
68, Loop is parallelizable
Accelerator restriction: scalar variable live-out from loop: color
PGCC-F-0704-Compilation aborted due to previous errors. (splot.cpp)
PGCC/x86-64 Linux 19.4-0: compilation aborted
我需要修改什么才能正确编译和运行我的代码?
问题是“for(int k=0;k<=n;k++ && mod<=4.)”中的“&& mod<=4.0”。 for 循环中的复合表达式是一个已知的 PGI 限制,目前在设备代码生成中不可用。
删除“&& mod<=4.0”将解决该问题。
我可以提交问题报告,但我不清楚为什么会有这段代码,因为它看起来无关紧要。你能解释一下意图吗?
我正在尝试学习使用 OpenACC 并开始使用一个简单的代码来实现它来计算 Mandelbrot 集,但是我在编译代码时收到错误。
我找到了这个
OpenACC must have routine information error
并认为它在我的代码中很容易使用,但它似乎不起作用。
这些是我想使用 OpenACC 的例程,以及我尝试过的方法
#pragma acc parallel loop copyout(color)
for (int i=0;i<=n0x;i++)
{
Cx=Re_start+dx*i;
#pragma acc loop
for (int h=0;h<=n0y;h++)
{
Cy=Im_start+dy*h;
Zx1=0.;
Zy1=0.;
#pragma acc loop
for(int k=0;k<=n;k++ && mod<=4.)
{
Zx=Zx1*Zx1-Zy1*Zy1+Cx;
Zy=2*Zx1*Zy1+Cy;
Zx1=Zx;
Zy1=Zy;
mod=(Zx*Zx+Zy*Zy);
if(mod<=4.)
{
if(k==n)
color[i][h]=-1;
color[i][h]=k+1;
}
}
}
}
我收到错误(我正在使用 pgc++ -acc splot.cpp -Minfo=accel
进行编译)
PGCC-S-0155-Compiler failed to translate accelerator region (see -Minfo messages): Unknown variable reference (splot.cpp: 48)
main:
48, Generating copyout(color[:][:])
Generating Tesla code
52, #pragma acc loop gang /* blockIdx.x */
59, #pragma acc loop seq
68, #pragma acc loop vector(128) /* threadIdx.x */
52, Accelerator restriction: scalar variable live-out from loop: color
59, Loop is parallelizable
Accelerator restriction: scalar variable live-out from loop: color
68, Loop is parallelizable
Accelerator restriction: scalar variable live-out from loop: color
PGCC-F-0704-Compilation aborted due to previous errors. (splot.cpp)
PGCC/x86-64 Linux 19.4-0: compilation aborted
我需要修改什么才能正确编译和运行我的代码?
问题是“for(int k=0;k<=n;k++ && mod<=4.)”中的“&& mod<=4.0”。 for 循环中的复合表达式是一个已知的 PGI 限制,目前在设备代码生成中不可用。
删除“&& mod<=4.0”将解决该问题。
我可以提交问题报告,但我不清楚为什么会有这段代码,因为它看起来无关紧要。你能解释一下意图吗?