2016-03-26 5 views
3

私は、プログラムに有効なスドクパズルソリューションが提供されているかどうかをテストするプログラムを設計しています。私は最初にC++で設計しましたが、今はそれを並列化しようとします。プログラムはエラーなく正常にコンパイルされます。C++関数にopenMPを適用して、sudokuパズルソリューションのすべての行を検証する方法は?

まず、構造化ブロックの内部でreturn文を使用する方法を理解しなければなりませんでした。私は真に初期化されたboolの配列を作ることにしました。しかし、この関数からの出力はfalseであり、私が提出している解決策が真実であることはわかっています。私はopenMPを初めて使っていて、誰かが私を助けてくれるのだろうかと思っていました。私は問題を感じている

は私の変数が戻っに設定すると、おそらくまた、バックに設定して得る私の他の変数nextSudokuNumとなっています。

bool test_rows(int sudoku[9][9]) 
{ 
    int i, j, a; 
    int nextSudokuNum = 1; 
    bool rowReturn[9]; 

#pragma omp parallel for private(i) 
    for(i = 0; i < 9; i++) 
    { 
     rowReturn[i] = true; 
    } 

#pragma omp parallel for private(i,j) \ 
    reduction(+: a, nextSudokuNum) 
    for(i = 0; i < 9; i++) 
    { 
     for(j = 0; j < 9; j++) 
     { 
     a = 0; 
     while(sudoku[i][a] != nextSudokuNum) { 
      a++; 
      if(a > 9) { 
       rowReturn[i] = false; 
      } 
     } 

     nextSudokuNum++; 
     } 
     nextSudokuNum = 1; 
    } 

    for(i = 0; i < 9; i++) 
    { 
     if(rowReturn[i] == false) { 
     cout << "Invalid Sudoku Solution(Next Valid Sudoku Number Not Found)" << endl; 
     cout << "Check row " << (i+1) << endl; 
     return false; 
     } 
    } 

    cout << "Valid sudoku rows(Returning true)" << endl; 
    return true; 
} 

答えて

0

免責事項:

まず第一に、ほぼ瞬時に実行する非常に小さなループまたはループを並列化しません。スレッドの作成によるオーバーヘッドは、ループの内部ステートメントを並行して実行することによって得られる利点を支配します。したがって、並列化する各反復で数千万のFLOPが実行されない限り、コードのシリアルバージョンは並列バージョンのコードよりも高速に実行されます。

したがって、(想定される)タスクを並列化するためのより良い計画は、より高いレベルで並列化することです。つまり、おそらくあなたはtest_rows(sudoku)test_columns(sudoku)、およびtest_box(sudoku)を別の関数の別の関数から呼び出していると考えられます。 OpenMP sectionsを使用してこれらの3つのシリアル関数を並列に呼び出すことができます。これら3つの関数のそれぞれを個別のOpenMP sectionと呼びます。これはあなたのCPUの3つのコアを使用することからのみ恩恵を受けるが、おそらくあなたはおそらくあなたのラップトップでこれをやっているので、おそらく2または4を持っているとにかく。あなたの実際の問題に今

あなたは単にi以上、j上で並列化されていません。したがって、変数nextSudokuNumが縮小されていないことがわかります。 i反復ごとに、nextSudokuNumは自己完結型です。したがって、ループ内で初期化され、#pragma omp parallel節にprivateが作成されます。

同様に、a以上の削減も行っていません。 iのすべての反復に対して、aが設定され、比較され、内部的にインクリメントされます。ここでも、それは私用変数でなければなりません。オーケー

#pragma omp parallel for private(i,j,a,nextSudokuNum) 
    for(i = 0; i < 9; i++) 
    { 
     // all private variables must be set internal to parallel region before being used 
     nextSudokuNum = 1; 

     for(j = 0; j < 9; j++) 
     { 
     a = 0; 
     while(sudoku[i][a] != nextSudokuNum) { 
      a++; 
      if(a > 9) { 
       rowReturn[i] = false; 
      } 
     } 

     nextSudokuNum++; 
     } 
    } 
+0

したがって、あなたの新しいコードは次のようになります。私は間違っている間違って読む必要があります。私はあなたが++演算を追跡しているときに、そのプロセスの合計を追跡するために減算を使用しなければならないと考えました。私は再び本を打つ必要があると思う。私はopenmpをよりよく理解するのに役立つリソースをお持ちですか? YouTubeの動画や有益な記事ご協力ありがとうございました! – xTaylorFerg

+0

あなたが削減について説明したのはまさに正しい... ...ですが、異なるプロセスによって増分された共有変数のみです*。古典的な削減の例は、異なるプロセスが配列の異なる部分で動作している配列の要素を要約しようとしています。 – NoseKnowsAll

+0

私は[この本](http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022)が非常に役に立ちましたが、無料の[オンラインチュートリアル](https:// computing。 llnl.gov/tutorials/openMP /)も参考になりますが、私の意見ではそれほど親切ではありません。 – NoseKnowsAll

関連する問題