2012-02-16 36 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