【问题标题】:make openmp loop to combine small arrays into one big array制作openmp循环以将小数组组合成一个大数组
【发布时间】:2012-12-23 11:31:49
【问题描述】:

我在 openmp 中有如下所示的循环,但出现分配错误:

!$OMP PARALLEL DO PRIVATE(fn)
  do fn=0, NFILES 
    allocate(temparray(1:3,1:Ntot))
    LOAD temparray FROM FILE(fn)
    Ntot = len(temparray)
    TOTALARRAY(1+nstart:nstart+Ntot,1:3)=temparray(1:Ntot, 1:3)
    deallocate(temparray)
    nstart=nstart+len(temparray)
  end do
!$OMP END PARALLEL DO

有没有办法将这些文件加载​​到内存中并使用 openmp 快速组合它们?还是我必须按顺序进行?我拥有的数组比这大得多——这只是为了演示。我想并行加载它们。

【问题讨论】:

  • 我不明白你的代码。 LOAD temparray FROM FILE(fn) 是什么?您只能使用字符参数调用 lenABC 是否从文件中加载?它们是一维数组,但分配了一个二维数组。 TOTALARRAY 赋值依赖于nstart,它在循环内重新定义。如果要依赖结果中元素的顺序,则必须执行 ORDERED openMP 循环。
  • Sigma,我删除了 abc,因为它令人困惑。 temparray 是从文件中加载的。它们是 3xNtot 数组。我只想尽快将 4 个不同文件中的数组组合成一个大数组。我想这是不可能的,因为每个文件的长度都不同,并且需要知道在 TOTALARRAY 中填充的位置。

标签: arrays loops fortran openmp do-loops


【解决方案1】:

Ntottemparray 应该是 private。否则,您将分配它并释放它并从不同的线程重写它,并且最终必须出错。你可能想要的是size,而不是len,但在这种情况下它只会返回3*Ntot

正如@sigma 所指出的,totalarray 中插入刚刚阅读的位置取决于阅读的进度。那是行不通的。你必须让它以某种方式可以预测。也许只是读取文件并在一次传递中获取位置,然后rewind 并通过真正的读取进行第二次传递。或者,如果可能的话,只使用常量数组。 (如果有必要,也可以在末尾使用pack,但这可能需要很长时间。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多