2016-03-26 6 views
3

Programa geçerli bir sudoku bulmaca çözümünün verilip verilmediğini test edecek bir program tasarlıyorum. İlk önce C++ 'da tasarladım ama şimdi paralel hale getirmek istiyorum. Program hatasız derler. Bir sudoku bulmaca çözümünün tüm satırlarını doğrulamak için openMP'yi bir C++ işlevine nasıl uygulanır?

Önce bir yapılandırılmış bloğunun içinde bir return ifadesi kullanılarak başa bir yolunu zorunda kaldı. Sadece doğru olarak başlatılan bir dizi dizi yapmaya karar verdim. Ancak bu işlevin çıkışı yanlıştır ve gönderdiğim çözümün gerçek olduğu gerçeğini biliyorum. OpenMP'ye yeni geldim ve birinin bana yardım edip edemeyeceğini merak ediyordum?

Bir sorunu duygu benim değişken bir benim diğer değişken nextSudokuNum geri ayarlı alma ile belki de geri ayarlanır ve alma ile var.

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; 
} 

cevap

0

Yasal Uyarı:

Öncelikle, neredeyse hemen yürütmek çok küçük döngüler veya döngüler parallelize yoktur. İş parçacığı oluşturmanın ek yükü, döngünün iç ifadelerini paralel olarak yürüterek elde edeceğiniz faydaya hükmedecektir. Dolayısıyla, her yineleme paralelleştirdiyseniz, binlerce milyon FLOP yaparsa, kodun seri sürümü kodun paralel sürümünden daha hızlı çalışır.

Bu nedenle, (muhtemel) görevleri koşutlama için daha iyi bir planı daha yüksek bir düzeyde parallelize etmektir. Yani, muhtemelen başka bir yerde bir işlevden test_rows(sudoku), test_columns(sudoku) ve test_box(sudoku) diyorsunuz. Yapabilecekleriniz bu üç seri işlevi OpenMP sections kullanarak paralel olarak çağırarak, bu üç fonksiyonun her birinin ayrı bir OpenMP section olduğunu çağırmaktır. Bu sadece CPU'nuzun 3 çekirdeğinden yararlanacak, ancak muhtemelen dizüstü bilgisayarınızda bunu yapıyorsunuz, bu yüzden muhtemelen 2 ya da 4'ünüz olacak. Gerçek sorunlara Şimdi

:

Sen ancak sadece i üzerinde, j üzerinde koşutlama değildir. Bu nedenle, nextSudokuNum değişkeninizin azaltılmadığını görebilirsiniz; Her i yineleme için, nextSudokuNum kendi kendine yeten. Bu nedenle, döngü içinde başlatılmalı ve #pragma omp parallel maddesinde private yapılmıştır.

Aynı şekilde, ya a üzerinde bir azalma performans göstermiyor. i'un her yinelemesi için, a, dahili olarak karşılaştırılır ve artırılır. Yine özel bir değişken olmalı. Tamam

#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

:

Bu nedenle, yeni kod gibi görünmelidir. Reddetmeyi yanlış okumalıydım. Bir ++ işleminin kaydını tutarken, bu işlemin toplam miktarını takip etmek için azaltmayı kullanmanız gerektiğini düşündüm. Sanırım kitapları tekrar vurmam gerek. Openmp'yi daha iyi anlayabilmem için kullanabileceğim herhangi bir kaynağınız var mı? YouTube videoları veya yardımcı bir makale. Yardımın için teşekkürler! – xTaylorFerg

+0

Redüksiyon ile ilgili anlattığınız şey tam olarak doğru ... * ama sadece farklı süreçler tarafından artırılan paylaşılan değişkenlerde *.Klasik azaltma örneği, dizinin farklı bölümlerinde farklı işlemlerin çalıştığı bir dizinin elemanlarını özetlemeye çalışıyor. – NoseKnowsAll

+0

[Bu kitap] (http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022) çok yararlı buldum, ancak ücretsiz [çevrimiçi dersler] var (https: // computing. llnl.gov/tutorials/openMP/) bu da benim için daha az ulaşılabilir olsa da, yararlıdır. – NoseKnowsAll

İlgili konular