这是我的代码的基本前提:
while(norm_of_error > tol){
#pragma omp parallel for
for(i = 1; i <= N*N; i++){
//printf("thread id: %d\n",omp_get_thread_num());
:
int val = based on i
:
#pragma omp critical
x[i-1] = val;
}
#pragma omp barrier
iter++;
}
Run Code Online (Sandbox Code Playgroud)
简而言之,我使用Jacobi迭代方法求解Ax = b.我的问题是,在printf()语句取消注释的情况下,norm_of_error趋向于零并且while循环结束.但是,通过简单地说出printf()声明,这不会发生.任何人都可以给我一个暗示,为什么printf()声明有任何影响?我猜这个问题与omp_get_thread_num()的调用有关,但我不明白为什么会有任何区别.
编辑:我将printf()语句更改为printf("hi\n");,代码工作.注释出来,代码不起作用.
与printf()语句一起使用但在删除时失败的代码通常是某些无效操作的标志,这些操作会影响某个程序中的内存(例如,从数组的末尾掉下来,解除引用NULL等).行为不当的代码可能完全在程序的其他部分(例如,不在包含该printf()语句的函数内)
当违规printf()陈述显然是无辜的,并且没有任何可能影响其他代码行为的副作用(例如printf("Hi\n"))时,这更有可能发生.
原因是额外的存在printf()实际上影响了整个程序的内存布局.因此,违规代码(可能在程序中某些完全不相关的部分)仍会覆盖内存,但后果会发生变化(例如,覆盖某些数据,允许程序更改,而不是导致操作系统终止的某些内存区域)该程序).
无论代码是否为多线程,都是如此.
如果没有完整的代码来说明问题(即其他人可以编译,构建和运行以获得相同症状的小样本),则不可能更具体.
| 归档时间: |
|
| 查看次数: |
3246 次 |
| 最近记录: |