是否可以使用Matlab(parfor)中的Parallel Computing Toolbox并行运行MEX文件? 我使用gfortran编译器将Fortran应用程序编译为MEX文件。它没有问题:
mass=getMass(x);
但是当我尝试并行运行时,它会崩溃。的Fe:
matlabpool 4
parfor i=1:80
mass(i)=getMass(x);
end
我收到以下错误:
使用 distcomp.remoteparfor / getCompleteIntervals 时出错(第22行) parfor正在使用的会话已关闭。
引起: 使用 distcomp.remoteparfor / getCompleteIntervals 时出错(第22行) parfor正在使用的会话已关闭。
客户端失去了与实验室3的连接。这可能是由于网络问题,或者 交互式matlabpool作业可能有错误。
其他功能(不是MEX)并行运行没有问题。我在OS X 10.8.5上使用Matlab R2013a。
答案 0 :(得分:1)
您可以轻松地为每个open
使用新的单位编号。一定要避免从更多线程写入同一个文件,但是根据你提供的内容,你似乎只有临时文件,它们应该没问题,它们可以通过单元号来区分。
如果您的编译器支持Fortran 2008中的newunit
说明符,那么非常简单:
integer :: u
open(newunit=u, form=...
write(u,fmt) the_variables
close(u)
它会自动分配一个未使用且未与任何硬连线单元号冲突的单元号,因为它是负数。
也可以编写一个函数,使用inquire
找到一个空闲单元,但是你不能同时从更多线程调用这样的函数。
subroutine newunit(unit)
integer,intent(out) :: unit
logical :: isOpen
integer, parameter :: MIN_UNIT_NUMBER = 10
integer, parameter :: MAX_UNIT_NUMBER = 99
do unit = MIN_UNIT_NUMBER, MAX_UNIT_NUMBER
inquire(unit = unit, opened = isOpen)
if (.not. isOpen) then
return
end if
end do
unit = -1
end subroutine newunit
存在更多高级版本。
答案 1 :(得分:0)
你的mex功能必须是线程安全的。如果它的一部分不是线程安全的,例如IO操作到单个文件,写入共享内存等,然后这些部分需要用互斥锁保护。