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_1
和Func_2
并要求main()
从DLL调用这些函数,而不是与main()
构建所有在一起,然后一切工作正常。
我怀疑函数本身返回乱码。而是检查你的代码是否有可能导致本地堆栈变量被覆盖的越界数组访问。 –
我同意Hristo。我不认为'omp_get_thread_num()'是一个问题。 16113312 = 0xF5DEA0,可能会被溢出损坏。 – minjang
你如何确定价值?你有没有机会使用'printf'?如果你在并行区域内部执行该操作,除非序列化访问,否则必然会导致输出损坏。 – paddy