2016-10-19 8 views
0

これは私の最初の週の並列プログラミングであり、これを理解できないようです。私がプログラムをデバッグすると、 "Generating numbers ..."に固執します。この問題を解決する唯一の方法は、別のループを作成して並列スレッドで実行することです。手伝ってくれませんか?別のループを作成して並列スレッドで実行する

#include <iostream> 
#include <cstdlib> 
#include <climits> 
#include <ctime> 
#include <time.h> 
#include <Windows.h> 

using namespace std; 

const int NSIZE = INT_MAX/5; 

void gen_numbers (float numbers[], int how_many); 
float gen_rand(int min, int max); 
float sum(float array[], int num_elements); 


float numbers[NSIZE]; 

int main() 
{ 
    unsigned int seed = time(0); 
    srand(seed); 

    __int64 start1 = GetTickCount(); 

    cout << "Generating numbers..." << flush; 
    gen_numbers(numbers, NSIZE); 
    cout << "done." << endl; 

    cout << "Summing the numbers..." << flush; 
    float answer = sum(numbers, NSIZE); 
    cout << "done" << endl; 
    __int64 end1 = GetTickCount(); 

    cout << "Total time: " << end1 - start1 << endl; 

    cout << "Answer: " << answer << endl; 
    system("pause"); 
    return 0; 
} 

float sum(float array[], int num_elements) 
{ 
    float nsum = 0.0; 
    #pragma omp parallel for reduction(+:nsum) 
    for (int i = 0; i < num_elements; i++) 
    { 
     nsum += array[i]; 
    } 
    return nsum; 
} 

void gen_numbers(float numbers[], int how_many) 
{ 
    #pragma omp parallel for 
    for (int i = 0; i < how_many; i++) 
    { 
     numbers[i] = gen_rand(0, 10); 
    } 
} 

float gen_rand(int min, int max) 
{ 
    return(min + static_cast <float> (rand())/
     (static_cast <float> (RAND_MAX/(max - min)))); 
} 
+0

'rand()'はスレッドセーフではありません。私はあなたが 'rand_r()'を使うべきだと思います。 –

答えて

-1

プログラムをデバッグするには、各式の後にcoutを使用します。 これで、どこで停止するか、各ステップでどのようなデータが得られるかがわかります。

+0

または、あなたのためにすべてのことをするデバッガを使用してください... – csmckelvey

+0

@takendarkk彼はすでにそれを使用していますパラレルスレッドのために助けてください。注意深い質問を読んでください: '私がプログラムをデバッグするとき、それは固まっています... ' –

関連する問題