2016-09-21 12 views
0

配列依存性を持つOpenACCコードを書いています。内部ループの各反復は配列の同じ位置を更新できます。 OpenACCでOpenACCで配列結果を結合する

#pragma omp parallel private(i) 
    { 
      long unsigned int digit_local[d+11]; 
      for(i=0;i<d+11;i++) 
        digit_local[i] = 0; 

      #pragma omp for 
      for (i = 1; i <= n; ++i) { 
        long unsigned int remainder = 1; 
        for (long unsigned int digit = 0; digit < d + 11 && remainder; ++digit) { 
          long unsigned int div = remainder/i; 
          long unsigned int mod = remainder % i; 
          digit_local[digit] += div; 
          remainder = mod * 10; 
        } 
      } 

      #pragma omp critical 
      for(long unsigned int digit = 0; digit < d+11; ++digit) 
        digits[digit] += digit_local[digit]; 

    } 

アレイとキーワードプライベート作品が、私はグローバルな配列を持つ民間の配列を結合する方法では考えている次のよう

long unsigned int digits[d + 11]; 
    for (long unsigned int digit = 0; digit < d + 11; ++digit) 
      digits[digit] = 0; 

    for (long unsigned int i = 1; i <= n; ++i) { 
      long unsigned int remainder = 1; 
      for (long unsigned int digit = 0; digit < d + 11 && remainder; ++digit) { 
        long unsigned int div = remainder/i; 
        long unsigned int mod = remainder % i; 
        digits[digit] += div; // here 
        remainder = mod * 10; 
      } 
    } 

OpenMPのバージョンが書いていた。ここではいくつかのコードです。

ありがとうございました。

答えて

0

OpenACCの "atomic update"ディレクティブを使用します。

  #pragma acc atomic update 
      digits[digit] += div; // here 

また、OpenMPバージョンと似たようなことができます。

long unsigned int digit_local[d+11][n]; 
    #pragma acc data create(digit_local) copyout(digits) 
    { 

    #pragma acc parallel loop gang vector 
    for (i = 1; i <= n; ++i) { 
      for(j=0;j<d+11;j++) digit_local[j][i] = 0; 
      long unsigned int remainder = 1; 
      for (long unsigned int digit = 0; digit < d + 11 && remainder; ++digit) { 
        long unsigned int div = remainder/i; 
        long unsigned int mod = remainder % i; 
        digit_local[digit][i] += div; 
        remainder = mod * 10; 
      } 
    } 

    #pragma acc parallel loop gang 
    for(long unsigned int digit = 0; digit < d+11; ++digit) { 
      long unsigned int dsum = 0; 
      #pragma acc loop vector reduction(+:dsum) 
      for (i = 1; i <= n; ++i) { 
      dsum += digit_local[digit][i]; 
      } 
      digits[digit] = dsum; 
    } 
    } 

しかし、私はどちらもスピードアップを見ていません。

希望します。 マット

+0

こんにちはマット、あなたの答えをありがとう。このディレクティブを試してみましたが、パフォーマンスは向上していません(同じ位置にいくつかのアップデートがあります)。 –

+0

アトミックが高価なので、スピードアップが見られないことは驚くことではありません。 –

+0

お返事ありがとうございます! –

関連する問題