当数组的大小变为 512 时,MATLAB 的幂函数计算常量基数和指数数组的逐元素指数变得明显更快。我预计计算时间会随着输入大小的增加而增加,但是,有当指数数组中有 512 个元素时明显下降。这是一个示例代码
x_list = 510:514;
for i = 1:numel(x_list)
x = x_list(i);
tic
for j = 1:10000
y = power(2,1:x);
end
toc
end
代码的输出是
Elapsed time is 0.397649 seconds.
Elapsed time is 0.403687 seconds.
Elapsed time is 0.318293 seconds.
Elapsed time is 0.238875 seconds.
Elapsed time is 0.175525 seconds.
这里发生了什么?
最佳答案
我看到使用随机数作为指数的效果与我使用 1:n
范围内的整数看到的效果相同:
x = 500:540;
t = zeros(size(x));
for ii = 1:numel(x)
%m = 1:x(ii);
m = 500*rand(1,x(ii));
t(ii) = timeit(@()power(2,m));
end
plot(x,t)
当强制 MATLAB 使用带有 maxNumCompThreads(1)
的单线程并再次运行上面的代码时,我看到了这个图表(注意 y 轴,峰值只是噪音):
在我看来,MATLAB 使用单个内核来计算 511 个值的指数,如果矩阵较大,则启动所有内核。使用多线程会产生开销,对于小数组不值得这样做。开销与时间节省平衡的确切点取决于许多因素,因此硬编码何时切换到多线程计算的固定阈值会导致在具有不同特征的系统上执行时间的跳跃阈值确定。
注意 @norok2 没有看到同样的跳跃,因为在他们的系统上 MATLAB was limited to a single thread .
关于matlab - 为什么 MATLAB 的逐元素求幂会加速 512 个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56972394/