我正在尝试使用 OpenACC(PGI 编译器)并行化我的顺序 C 代码并卸载到 NVIDIA GPU
我的代码是按顺序编写的。并且经常调用很长的函数,如下所示。
int main()
{
// blah blah...
for(i=0; i<10; i++)
{
for(j=0; j<20; j++)
{
big_function(a,b,c);
}
}
// blah blah...
}
int big_function(a,b,c)
{
small_function_1(a);
small_function_2_with_data_dependencies(b);
}
那种情况下,big_function()可以并行化运行在GPU上吗?
我使用#pragma acc kernels将整个 for 循环声明为并行区域 。如下所示。
#pragma acc routine
int big_function(int a, int b, int c);
#pragma acc routine
int small_function_1(int a);
#pragma acc routine
int small_function_2_with_data_dependencies(int b);
int main()
{
// blah blah...
#pragma acc data ~~~~
#pragma acc kernels
for(i=0; i<10; i++)
{
for(j=0; j<20; j++)
{
big_function(a,b,c);
}
}
// blah blah...
}
int big_function(a,b,c)
{
small_function_1(a);
small_function_2_with_data_dependencies(b);
}
但是编译后的文件需要很长时间才能完成。结果是不正确的。
我可以使用 OpenACC 来并行化使用许多函数调用的顺序代码吗?
或者我是否必须将big_function()分解为小部分?