在编译openacc代码时,我收到以下警告 215,在第239行循环后需要标量的最后一个值 在第239行的y循环之后需要标量最后一个值 在第240行的x循环之后需要标量最后一个值 在第240行的y循环之后需要标量最后一个值 在第242行的x循环之后需要标量最后一个值 在第242行的y循环后需要标量最后一个值 在第246,248行的x循环之后需要标量最后一个值 在第248,252行的y循环之后需要标量最后一个值
此类警告是否使程序按顺序运行如何在OpenACC中使用lastvalue子句?
答案 0 :(得分:1)
是的,这些警告可能导致代码顺序运行(请参阅-Minfo = accel的编译器反馈输出,假设您正在使用PGI)。默认情况下,标量首先是私有的。但是,如果标量的值在OpenACC计算区域之外使用,则编译器不能自动对标量进行私有化,因为它不知道要使用哪个值。
在计算区域之后使用标量变量时会发生这种情况,例如
#pragma acc parallel loop
for (int i=...
x = <expr>
...
}
printf("Final X=%d\n",x);
你可以在私人子句中处理我的推杆“x”,但是为“x”打印的值将与循环前的值保持不变。
可能发生这种情况的另一种情况是更新计算区域内的全局标量。在这种情况下,您可能希望将变量放在数据子句(例如“copy”)中以使变量由所有线程共享,然后在更新值时使用OpenACC“atomic”指令。
第三种情况是标量通过地址传递给设备子程序。在这种情况下,编译器必须假定其他引用是标量。虽然很可能你不会指定一个指向标量的全局指针,但是由于编译器没有对子程序的可见性,所以它必须假定它。要修复,请将标量添加到OpenACC“private”子句,或更改代码以按值传递标量。请注意,默认情况下Fortran按地址传递参数。要传递值,请在参数声明中使用F2003“value”属性。
如果您的情况与上面列出的情况不同,请提供说明问题的示例代码。