OPENACC 如何在#pragma acc 例程中处理库函数
OPENACC How to handle a library function in a #pragma acc routine
我必须在这个例程中调用 <stdlib.h>
函数 exit()
:
#pragma acc routine(Check) seq
int Check (double **u, char *str)
{
for (int i = beg; i <= end; i++) {
for (int v = 0; v < vend; v++) {
if (isnan(u[i][v])) {
#pragma acc routine(Here) seq
Here (i,NULL);
#pragma acc routine(exit)
exit(1);
}
}}
return 0;
}
我收到错误:
nvlink 错误:在 'tools.o'
中未定义对 'exit' 的引用
通常我通过在函数体之前添加例程 #pragma acc routine
来解决这个问题,但在这种情况下我处理的是库函数。
从设备调用的所有例程都需要例程的设备可调用版本。通常系统例程没有设备可调用版本,包括“退出”,因此无法使用。
不过,您无法从设备代码中退出主机应用程序,因此您可能需要重新考虑这部分代码。不要使用“exit”,而是要捕获错误,然后在执行返回到主机后中止。
我必须在这个例程中调用 <stdlib.h>
函数 exit()
:
#pragma acc routine(Check) seq
int Check (double **u, char *str)
{
for (int i = beg; i <= end; i++) {
for (int v = 0; v < vend; v++) {
if (isnan(u[i][v])) {
#pragma acc routine(Here) seq
Here (i,NULL);
#pragma acc routine(exit)
exit(1);
}
}}
return 0;
}
我收到错误:
nvlink 错误:在 'tools.o'
中未定义对 'exit' 的引用通常我通过在函数体之前添加例程 #pragma acc routine
来解决这个问题,但在这种情况下我处理的是库函数。
从设备调用的所有例程都需要例程的设备可调用版本。通常系统例程没有设备可调用版本,包括“退出”,因此无法使用。
不过,您无法从设备代码中退出主机应用程序,因此您可能需要重新考虑这部分代码。不要使用“exit”,而是要捕获错误,然后在执行返回到主机后中止。