我有这个循环,在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快速组合它们?或者我必须按顺序进行吗?我拥有的阵列比这大得多 - 这只是为了演示。我想并行加载它们。
答案 0 :(得分:2)
Ntot
和temparray
应为private
。否则,您将分配它并释放它并从不同的线程重写它,并且必须以错误结束。你可能想要len
,而不是size
,但在这种情况下它只会返回3*Ntot
。
正如@sigma指出的那样,totalarray
中插入刚刚读取的位置取决于阅读的进度。这无济于事。你必须让它以某种方式可预测。也许只需阅读文件并在一次通过中获得位置,然后rewind
并使用真实读取进行第二次传递。或者只是使用常量数组,如果可能的话。 (如有必要,最后也可以使用pack
,但这可能需要很长时间。)