用于更新图形元素的 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 计算都是多线程的,您不需要为此做任何特殊的事情。
我正在尝试加快图形的更新过程 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 计算都是多线程的,您不需要为此做任何特殊的事情。