シーケンシャル C コードを並列化し、OpenACC (PGI コンパイラ) を使用して 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()を分割して小さな部分に分割する必要がありますか?