2012-02-16 76 views
0

我是一位使用OpenMP和C++的新手。我正在做一個簡單的函數,使用for循環加載兩個數組。這些數組被定義爲複雜的。使用OpenMP的複雜類型

#include <omp.h> 
#include <iostream> 
#include <stdlib.h> 
#include <complex> 
#define CHUNKSIZE 10 
#define N  100 

using namespace std; 

int main (int argc, char *argv[]) 
{ 
int nthreads, tid, i, chunk; 
complex<double> a[N], b[N], c[N]; 

/* Some initializations */ 
for (i=0; i < N; i++) 
    a[i].real() = b[i].real() = i * 1.0; 
chunk = CHUNKSIZE; 

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid) 
{ 
    tid = omp_get_thread_num(); 
    if (tid == 0) 
    { 
     nthreads = omp_get_num_threads(); 
     printf("Number of threads = %d\n", nthreads); 
    } 
    printf("Thread %d starting...\n",tid); 

#pragma omp for schedule(dynamic,chunk) 
    for (i=0; i<N; i++) 
    { 
     c[i] = a[i] + b[i]; 
     printf("Thread %d: c[%d]= %e\n",tid,i,c[i]); 
    } 

} /* end of parallel section */ 

} 

當我編譯,我得到這樣的警告:

omp_complex.cpp:43:警告:不能通過非POD類型的對象的結構的std ::複雜'到「...」;呼叫將在運行時中止

如果我運行a.out,屏幕上會顯示「非法指令」消息。我試圖找出發生了什麼,但我沒有找到任何好的參考。有誰知道在OpenMP指令中是否允許複雜類型?

+0

這與OpenMP沒有任何關係。下一次,將您的代碼降至最低以解決問題! – 2012-02-16 13:04:11

回答

4

的錯誤是在這裏:

printf("Thread %d: c[%d]= %e\n",tid,i,c[i]); 

printf不知道(而且沒有辦法知道)如何處理std::complex。使用C++流操作輸出複雜類型。此外,爲了避免併發性問題,您需要在寫入stdout之前將數據流導入線程本地緩衝區,否則C++流語法會創建競爭條件。

我通常使用該宏(但C++ 11使這更容易可變參數模板):

#define THREAD_SAFE_OUT(out, message) \ 
    do { \ 
     std::ostringstream buffer; \ 
     buffer << message; \ 
     out << buffer.str(); \ 
    while (false) 

… 

THREAD_SAFE_OUT(std::cout, "Thread " << tid << ": c[" << i << "] = " << c[i]); 

字款式時使用OpenMP:

不要使用private指令。這只是需要在方法開始時聲明所有變量的語言的解決方法。由於C++沒有強制執行此操作,因此首次使用時聲明變量(即內部的並行部分)會更好(始終)。這樣,它們也是線程私有的。

+0

非常感謝。這就是問題。其實,我在其他代碼中有另一個,我寫了這個小程序來簡化,我認爲我有類似的錯誤,但它沒有! – AlexNoir 2012-02-16 15:22:03

+0

謝謝你延長你的答案。不使用私人指令也解決了我遇到的一個大問題。偉大的建議! – AlexNoir 2012-02-16 16:20:12

2

你的問題是通過std::complex<double>printf,正如編譯器告訴你,它不會工作。你希望它如何顯示?

你應該分別打印真實和虛擬的部分,或者如果你想要的話,打印標準和階段。

+0

非常感謝。這就是問題。其實,我在其他代碼中有另一個,我寫了這個小程序來簡化,我認爲我有類似的錯誤,但它沒有! – AlexNoir 2012-02-16 15:21:03