Fortran OpenMP:扩展共享阵列
我需要一些关于以下问题的帮助: 我的计算结果存储在一个数组中,该数组在OMP线程之间共享。 由于我不知道最终结果将有多少条记录,因此我需要动态扩展,即取消分配/重新分配,这只能按顺序进行。 我希望避免每次使用OMP临界值检查大小,因为这会大大降低代码的速度,并且只有在有足够的结果可用时,才需要再次扩展结果数组 因此,我提出了以下代码,但我并不喜欢(但它完成了工作): 上面代码背后的想法是首先检查仍然处于并行上下文中的变量。 如果有一个线程发现需要“重新分配”,那么它首先需要再次检查,但是在关键上下文中。一旦一个线程完成了关键区域,其他线程就会注意到不再需要生长的条件,并退出关键区域 我上面的想法是否有错误,或者更好:是否有更精简的方法来处理阵列的增长? 如果感兴趣:数组的类型是自定义类型,我可以得到介于1.000和10.000.000之间的结果(将来这个上限可能不再适用)Fortran OpenMP:扩展共享阵列,fortran,openmp,Fortran,Openmp,我需要一些关于以下问题的帮助: 我的计算结果存储在一个数组中,该数组在OMP线程之间共享。 由于我不知道最终结果将有多少条记录,因此我需要动态扩展,即取消分配/重新分配,这只能按顺序进行。 我希望避免每次使用OMP临界值检查大小,因为这会大大降低代码的速度,并且只有在有足够的结果可用时,才需要再次扩展结果数组 因此,我提出了以下代码,但我并不喜欢(但它完成了工作): 上面代码背后的想法是首先检查仍然处于并行上下文中的变量。 如果有一个线程发现需要“重新分配”,那么它首先需要再次检查,但是在关键上
任何建议都将不胜感激。谢谢大家! 你可以试着用它做实验吗?当线程可以访问数组时,这给了您更多的灵活性(在重新分配数组时阻止线程访问数组)。这取决于您正在执行的操作的确切结构,但我担心上述操作可能会受到竞争条件的影响。如果在第一次测试刚刚完成后resCnt增加,会发生什么情况?第一个线程是否可以在另一个线程完成关键测试之前使用非法索引写入results_temp?也许其他地方有一些额外的同步可以阻止这种情况的发生。每个线程是否最好写入自己的私有数组,然后在最后合并它们?是否确实不知道数组的大小?最好的解决方案是计算阵列的大小。这可能是可能的,也可能不是,但总有办法。也许,您可以先在数组中循环,而无需进行任何计算,只是为了计算最终将包含多少个元素。这应该是一个便宜的操作,可能比动态重新分配更便宜。我不清楚到底是什么阻止了您创建线程专用阵列并最终合并它们,这似乎是最合理的方法。
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