用于更新图形元素的parfor

时间:2018-08-18 08:32:05

标签: matlab parallel-processing matlab-figure parfor

我正在尝试加快图形窗口的更新过程。我正在使用它来产生刺激,使物体在屏幕周围移动。我试图分离所有进程,以加快窗口速度。修改了对象坐标,并在矩阵上执行了所有计算,因此代码不必从每个对象中提取,只需更新位置代码即可。

当放在基本的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

1 个答案:

答案 0 :(得分:0)

您正在ObjList部分的parfor中更新

ObjList = gh.ObjectList;

(我想)是对象句柄的列表。

parfor将此数组的各个部分复制到所有工作进程,这些工作进程将对其进行修改,然后将其发送回。然后,主要过程会将这些部分重新组装成一个数组。到现在,这个新数组可能不再引用gh.ObjectList中的原始对象句柄。

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

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


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

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