2013-01-01 41 views
3

的代码是千行,所以我不能粘贴他们,但功能流程看起来莫名其妙地像:omp_get_thread_num()返回窃听号码?

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_1Func_2并要求main()从DLL调用这些函数,而不是与main()构建所有在一起,然后一切工作正常。

+3

我怀疑函数本身返回乱码。而是检查你的代码是否有可能导致本地堆栈变量被覆盖的越界数组访问。 –

+0

我同意Hristo。我不认为'omp_get_thread_num()'是一个问题。 16113312 = 0xF5DEA0,可能会被溢出损坏。 – minjang

+0

你如何确定价值?你有没有机会使用'printf'?如果你在并行区域内部执行该操作,除非序列化访问,否则必然会导致输出损坏。 – paddy

回答

0

我曾经遇到过这个错误,当我试图设置不同数量的线程比导出所需的时候。即开始您的应用程序之前,你必须

export OMP_NUM_THREADS 4 

检查是否在此位置的线程数量比你在使用OMP_SET_NUM_THREADS什么不同();

希望这会有所帮助。