dev*_*rat 8 matlab exponentiation
当数组的大小变为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
Run Code Online (Sandbox Code Playgroud)
代码的输出是
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.
Run Code Online (Sandbox Code Playgroud)
这是怎么回事
Cri*_*ngo 11
我看到使用指数随机数的效果相同,就像使用范围内的整数一样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)
Run Code Online (Sandbox Code Playgroud)
当迫使MATLAB与一起使用单个线程maxNumCompThreads(1)并再次运行上面的代码时,我会看到此图(请注意y轴,峰值只是噪声):
在我看来,MATLAB使用单个核来计算511个值的指数,并且如果矩阵较大,则会激发所有核。使用多线程会产生开销,对于小型数组而言,这样做是不值得的。通过节省时间来平衡开销的确切点取决于许多因素,因此,硬编码固定阈值以决定何时切换到多线程计算,会导致具有与以下特性不同的系统的执行时间增加:确定阈值。
请注意,@ norok2不会看到相同的跳转,因为在其系统上,MATLAB仅限于单个线程。
这与计算功率的数量的大小有关,而不是与容器的大小有关。
如果使用随机数,则对于不同的容器大小,不会在时间上出现跳跃:
x = 450:1550;
y = zeros(numel(x), 1);
X = rand(1, 10000);
for i = 1:length(x)
f = @() 2 .^ X(1:x(i));
y(i) = timeit(f);
end
figure()
plot(x, y)
Run Code Online (Sandbox Code Playgroud)
因此,问题必须出在很大数量的计算上。我首先以为这可能与溢出有关,但是溢出发生的原因2 ^ 1024 == inf是MATLAB遵循的IEEE标准所规定的,并且我认为这样做inf比实际计算数值要快得多。
以下基准测试支持这一点,其中数组的大小保持恒定:
x = 450:1550;
y = zeros(numel(x), 1);
X = rand(1, 10000);
for i = 1:length(x)
f = @() 2 .^ (ones(1, 500) * x(i));
y(i) = timeit(f);
end
figure()
plot(x, y)
Run Code Online (Sandbox Code Playgroud)
到底为什么这可能是有关您的设置时2 ^ 512,而不是2 ^ 1024,我真的不明白。
(请注意,我使用2 .^ ...代替,power(2, ...)但结果是相同的。)
另外,在我的系统中运行@CrisLuengo的代码并不会真正重现任何跳转。
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)
Run Code Online (Sandbox Code Playgroud)
到目前为止,所有证据表明峰值与JIT延迟/预热有关。
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |