在Matlab中使用MEX文件进行并行计算?

时间:2014-05-19 10:38:53

标签: matlab parallel-processing fortran mex parfor

是否可以使用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。

2 个答案:

答案 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操作到单个文件,写入共享内存等,然后这些部分需要用互斥锁保护。