OpenMP:扩展共享阵列

时间:2020-02-13 19:32:49

标签: fortran openmp

我需要以下问题的帮助:

我的计算结果存储在一个数组中,该数组在OMP线程之间共享。 由于我不知道最终结果将包含多少个条目,因此我需要动态扩展,即取消分配/重新分配它,这只能顺序发生。 我想避免每次使用OMP临界值检查大小,因为这会使代码减慢很多,并且只有在有足够的结果可用时,才需要再次扩展结果数组。

因此,我想到了以下代码,但是我不太喜欢(但可以完成工作):

if (resCnt> curAlloc) then 
    !$OMP CRITICAL
    if (resCnt> curAlloc) then 
        allocate(results_temp(1:resCnt+allocationStep))
        results_temp(1:resCnt) = results
        call MOVE_ALLOC(results_temp, results)
        curAlloc = curAlloc+allocationStep
   end if
   !$OMP END CRITICAL
end if

上面代码背后的想法是,首先在并行上下文中检查变量。 如果然后有一个线程发现需要“重新分配”,则首先需要再次检查,但是在关键情况下。一旦一个线程完成了关键区域,其他线程就会注意到不再需要生长条件,并且也退出了关键区域。

我上面的想法是否有错误,或者更好:是否有更精简的方法来处理数组? 如果有兴趣:数组的类型是自定义类型,我可以得到介于1.000到10.000.000之间的结果(将来此上限可能不再成立)。

任何建议都值得赞赏。谢谢!

0 个答案:

没有答案
相关问题