用于更新图形元素的 parfor

parfor for updating figure elements

我正在尝试加快图形的更新过程 window。我用它来产生一种刺激,让物体在屏幕上移动。我试图将所有进程分开以加快 window。对象坐标被修改,所有计算都在矩阵上执行,因此代码不必从每个对象中提取,只需更新位置代码。

代码留在基本的 for 循环中时效果很好。但是,当我尝试合并一个 parfor 循环以利用并行处理时;系统停止工作。对象仍然出现在屏幕上和适当的空间中,但没有任何移动。

有人知道为什么会这样吗?我附上了有问题的部分代码。我正在构建一个对象来保存所有变量,这就是为什么我有变量 gh。

function RunStim(gh)
figure(gh.StimWindow);                                          % select Stimulus window to display moving objects

TrialLength = 20;                                               % Length of trial to be run
Framerate = 60;                                                 % Freshrate of window
ObjSpeed = 20;                                                  % speed objects will travel across field

ObjList = gh.ObjectList;                                        % Container holding movable objects present in the figure
ObjLocX = gh.ObjectLocX;                                        % cell matrix containing object X locations (objects have varying sizes of points)
ObjLocY = gh.ObjectLocY;                                        % cell matrix containing object Y locations (objects have varying sizes of points)
ObjRotation = gh.ObjectRotation;                                % array containing list of objects rotations

NumofObj = length(ObjList);                                     % Number of Objects in stim system

timer = tic();                                                  % Timer for the stimulus            
moveforward = .03*.1*ObjSpeed;                                  % Reduce stepping by X amount to account for angular movement along a circle


while toc(timer) < TrialLength                                  % Run stimulus through length of project
    NextStepX = cellfun(@(x) x+moveforward,ObjLocX,'un',0);
    NextStepY = cellfun(@(x) x+moveforward,ObjLocY,'un',0);
    NextRot = ObjRotation + moveforward;

    parfor aa = 1:NumofObj
        ObjList{aa}.XData = NextStepX{aa};
    end

    ObjLocX = NextStepX;                                        % Update X location matrix for next step
    ObjLocY = NextStepY;                                        % Update Y location matrix for next step
    ObjRotation = NextRot;                                      % Update Rotation matrix for next step

    pause(1/Framerate)                                          % Pause window briefly to allow for drawing
end

您正在 parfor 部分更新 ObjList,其中

ObjList = gh.ObjectList;

是(我猜)对象句柄列表。

parfor 将这个数组的部分复制到所有工作进程,修改它们然后将它们发回。主进程然后将这些部分重新组合成一个数组。很可能现在这个新数组不再引用 gh.ObjectList.

中的原始对象句柄

请注意,这些工作进程无法访问主进程的内存,因此无法更新显示。

简而言之,应该是并行计算,而不是更新图形。


parfor 不适用于多线程计算,它启动 MATLAB 的新实例(默认情况下在本地,但原则上意味着每个 运行 在集群中的不同计算机上)。在 parfor 循环中,您不共享内存,但也不共享任何其他内容。如果工作人员要更新数字 window,您将看不到它。参见 Decide When to Use parfor

请注意,默认情况下,大多数 MATLAB 计算都是多线程的,您不需要为此做任何特殊的事情。