3

在 Matlab (2012b) 中,有没有办法在 SPMD 创建的一个线程发送数据之前停止它?因为线程 2 只有有限大小的缓冲区来接收来自线程 1 的数据,并且根据 matlab,labSend() 将在数据传输完成之前返回,这意味着理论上线程 1 可以继续向线程 2 发送数据,直到系统运行记不清:

我想做的是这样的:

 spmd (2)

  if labindex==1
    %...
    if (BufferAtLab2isNotFull)
        labSend(data, 2);
    end
    %...
  elseif labindex==2
    if (BufferNotFull)
      labReceive(data, 1);
    end
    %...

  end
 end

在 C/C++ 中,使用共享内存多线程很容易做到这一点,但在 matlab 中似乎很难,因为没有可检查的共享资源。

4

1 回答 1

0

如果您希望 lab 1 在每个之后等待,labSend直到 lab 2 完成它labRecieve,然后简单地将 a 添加labBarrier到每个中,这将导致 lab 1 等待,直到所有线程都到达该点。

spmd (2)
  if labindex==1
    %...
    if (BufferAtLab2isNotFull)
      labSend(data, 2);
    end
    labBarrier;
    %...
  elseif labindex==2
    labSend(bufSize,1);
    %...
    if (BufferNotFull)
      labReceive(data, 1);
    end
    labBarrier;
    %...
  end
end

如果您担心 Lab 1 在单个 labSend 中发送过多,您总是可以让 lab 2 先发送它的缓冲区大小。

于 2014-03-22T23:06:25.210 回答