1

最近、GCC コミュニティでは、コンパイラで OpenACC をサポートするためのいくつかの取り組みが行われています。だから、私はそれを試してみたかった。

GCC Web サイトのメイン ドキュメントに近いこの段階的なチュートリアル (チュートリアル) を使用して、OpenACC をサポートするGCC 6.1をコンパイルおよびビルドすることができました。

次に、次のコマンドを使用してプログラムをコンパイルしました。

gcc pi.c -fopenacc -foffload=nvptx-none -foffload="-O3" -O3

そして、すべてがエラーなしで進みます。

実行はエラーなしですが、正解はありません。

私のCコードと実行中のプログラムの出力は次のとおりです。

#include <stdio.h>
#include <openacc.h>

#define N 20000

#define vl 1024

int main(void) {

  double pi = 0.0f;
  long long i;
  int change = 0;

  printf("Number of devices: %d\n", acc_get_num_devices(acc_device_nvidia));

  #pragma acc parallel 
  {
    change = 1;
    #pragma acc loop reduction(+:pi) private(i)
    for (i=0; i<N; i++) {
      double t= (double)((i+0.5)/N);
      pi +=4.0/(1.0+t*t);
    }
  }

  printf("Change: %d\n", change);

  printf("pi=%11.10f\n",pi/N);


  pi = 0.0;

  for (i=0; i<N; i++) {
    double t= (double)((i+0.5)/N);
    pi +=4.0/(1.0+t*t);
  }

  printf("pi=%11.10f\n",pi/N);

  return 0;

}

そして、これは実行後の出力a.outです:

Number of devices: 1
Change: 0
pi=0.0000000000
pi=3.1415926538

何か案は?

4

1 に答える 1

1

ブロックの代わりにループに「平行」に移動してみてください。

//  #pragma acc parallel
  {
    change = 1;
    #pragma acc parallel loop reduction(+:pi)
    for (i=0; i<N; i++) {
      double t= (double)((i+0.5)/N);
      pi +=4.0/(1.0+t*t);
    }
  }

gcc 6.1でこれを試したところ、正しく機能しました。スカラーはデフォルトで非公開であるため、"i" を非公開にする必要はないことに注意してください。

于 2016-08-05T21:49:03.503 に答える