我需要以下问题的帮助:
我的计算结果存储在一个数组中,该数组在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之间的结果(将来此上限可能不再成立)。
任何建议都值得赞赏。谢谢!