(以下在Macbook Pro 2.3GHz i7 Haswell和16GB RAM上进行)
问题
在Matlab中我有一个3D数据处理算法。在这种情况下,三维嵌套循环,其中维度在每个向量的&lt; 1000值的范围内(即z <1000,y <1000,x <1000)。对于每个体素,执行动态计算集。当从Matlab命令行执行时,算法的速度很好。它可以在相对高端的机器上运行。
当我将这个相同的代码(复制和粘贴)移动到由Matlab生成的GUIDE GUI回调函数(一个Button)时,执行速度变慢到绝对爬行。它不是正常速率的1/10或甚至1/100。可能它会以正常速度的1/1000收盘......或某种顺序。
思想
所以我最初的想法是,这种激进的性能打击必须以某种方式来自GUI。所以我尝试实现parfor
Matlab关键字,以便并行运行计算密集型for循环。这是不可能的,因为在parfor
- 循环内创建的任何变量都不能在它之外使用。或者至少这是我解释在尝试使用该方法时得到的Matlab错误。
我也尝试在新线程中生成计算但似乎没有以任何方式提高性能。
问题
我的问题:从Matlab GUI运行时,是否有某种方式可以执行计算密集型任务?
加成
这种情况的伪代码。在循环中使用以下Matlab函数:max(),abs(),sqrt(),zeros(),mod(),fprintf()请注意fprintf()的使用并不过分,我知道过度调用此类函数可能会导致性能下降。
for-loop
fprintf(1,'%d ',i);
if (mod(i,20)==0)
fprintf(1,'\n'); % output iteration status
end
for-loop
for-loop
some variable assignments
declare variables and init them to 1 or 0
for-loop Xvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
for-loop Yvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
for-loop Zvar
if ((condition)) <= 0.0
variable assignment
end
if ((condition)) <= 0.0
variable assignment
end
end
somevariable=zeros(args);
for-loop
multiplication assignment to variable
multiplication assignment to variable
variable assignment
for-loop
for-loop
for-loop
sqrt calculation with some divisions and squares
if-statement
subtraction addition assignment
if-statement
var=some other var;
end
end
end
end
end
somevarindexed(m)=stuff calculated above;
end
variable assignment;
3Dvector(x,y,z) assignment;
3Dvector(x,y,z) assignment;
end
end
end
答案 0 :(得分:0)
在三层循环内发生变化的全局矩阵变量是导致此问题的原因。重新分解代码后,现在一切都按预期工作。