2016-10-19 90 views
0

這是我第一個並行編程的一週,我似乎無法弄清楚這一點。當我調試程序時,它停留在「生成號碼...」。我認爲解決這個問題的唯一方法是爲自己創建另一個循環,並在並行線程中運行它。你能幫我麼?創建另一個循環並以並行線程運行

#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_r()' –

回答

-1

調試程序可能每個表達式後使用cout。 所以你會知道你停在哪裏以及每一步的數據是什麼。

+0

或者只是使用一個調試器,它爲你做了所有這些... – csmckelvey

+0

@takendarkk他已經在使用它,由於並行線程的幫助。仔細閱讀問題:'當我調試程序時,它被困在...' –