【发布时间】:2016-11-13 07:32:02
【问题描述】:
----------编辑--------------
我将代码编辑如下:
#pragma omp parallel for private(i, piold, err) shared(threshold_err) reduction(+:pi) schedule (static)
{
for (i = 0; i < 10000000000; i++){ //1000000000//705035067
piold = pi;
pi += (((i&1) == false) ? 1.0 : -1.0)/(2*i+1);
err = fabs(pi-piold);
if ( err < threshold_err){
#pragma omp cancel for
}
}
}
pi = 4*pi;
我用 LLVM3.9/Clang4.0 编译它。当我用一个线程运行它时,我会通过 pragma cancel 操作获得预期的结果(检查非 pragma cancel 版本,导致运行速度更快)。
但是当我使用线程 >=2 运行它时,程序进入循环。我在 NUMA 机器上运行代码。怎么了?可能取消条件不满足!但是代码比单线程非pragma-cancel版本需要更长的时间!!仅供参考,它在 OMP_CANCELLATION=false 时运行文件。
我有以下 OpenMP 代码。我正在使用 LLVM-3.9/Clang-4.0 来编译这段代码。
#pragma omp parallel private(i, piold, err) shared(pi, threshold_err)
{
#pragma omp for reduction(+:pi) schedule (static)
for (i = 0; i < 10000000 ; i++){
piold = pi;
pi += (((i&1) == false) ? 1.0 : -1.0)/(2*i+1);
#pragma omp critical
{
err = fabs(pi-piold);// printf("Err: %0.11f\n", err);
}
if ( err < threshold_err){
printf("Cancelling!\n");
#pragma omp cancel for
}
}
}
不幸的是,我认为#pragma omp cancel for 不会终止整个for 循环。最后我打印出err 值,但再次使用并行性,它会混淆正在打印的值。 err 的最终值小于threshold_err。打印取消是打印但在程序的最开始,这是令人惊讶的。之后程序继续运行!
如何确保这是正确的实现?顺便说一句,OMP_CANCELLATION 设置为 true,并且一个小型测试程序为相应的函数 omp_get_cancellation() 返回“1”。
【问题讨论】:
标签: c++ openmp cancellation numa