0

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

4

1 回答 1

2

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

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

于 2012-12-21T23:05:07.780 回答