3

代码有数千行,所以我无法粘贴它们,但函数流程看起来像:

void Func_1(double * x, int nx, NUM_THREADS)
{
  omp_set_num_threads(NUM_THREADS);
 //...
};



void Func_2(double *y, int ny, NUM_THREADS)
{ 

 omp_set_num_threads(NUM_THREADS);
   //...
  #pragma omp parallel for 
    for (int i=0; i<N; ++i)
    {
      int threadID=omp_get_thread_num();
       //...
     };

 };



int main (void)    
{

//...
  Func_1(x, nx, NUM_THREADS);
  Func_2(y, ny, NUM_THREADS);

//...

};

所以基本上我得到了两个函数,每个函数都调用 omp_set_num_threads ,问题是,现在如果我构建程序,那么threadID运行时返回的完全是胡说八道,threadID变成一些非常大的 int 数,比如 16113312 ......远远超过NUM_THREADS.

有没有人在使用 Open MP(Intel ICC 13.0)时遇到过类似的问题?

顺便说一句,一个可能的提示是,但是我在单独的 DLL 库中构建Func_1并要求从 DLL 调用这些函数,而不是与 DLL 一起构建它们,然后一切正常。Func_2main()main()

4

1 回答 1

0

当我尝试设置与导出所需线程数不同的线程数时,我遇到了这个错误。即在开始您的应用程序之前,您必须

export OMP_NUM_THREADS  4

检查此位置的线程数是否与您在 omp_set_num_threads() 中使用的不同;

希望这可以帮助。

于 2013-03-13T23:01:16.307 回答