make openmp loop将小数组合成一个大数组

时间:2012-12-21 19:40:56

标签: arrays loops fortran openmp do-loops

我有这个循环,在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快速组合它们?或者我必须按顺序进行吗?我拥有的阵列比这大得多 - 这只是为了演示。我想并行加载它们。

1 个答案:

答案 0 :(得分:2)

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

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