优化值 N 以拆分数组以向量化数组,使其运行最快

Optimizing the value N to split arrays up for vectorizing an array so it runs the quickest

我正在尝试优化值 N 以拆分数组以对数组进行矢量化,使其 运行 在不同的机器上最快。我在下面有一些测试代码

#example use random values
clear all,
t=rand(1,556790);
inner_freq=rand(8193,6);

N=100; # use N chunks
nn = int32(linspace(1, length(t)+1, N+1))
aa_sig_combined=zeros(size(t));
total_time_so_far=0;
for ii=1:N
    tic;
    ind = nn(ii):nn(ii+1)-1;
    aa_sig_combined(ind) = sum(diag(inner_freq(1:end-1,2)) * cos(2 .* pi .* inner_freq(1:end-1,1) * t(ind)) .+ repmat(inner_freq(1:end-1,3),[1 length(ind)]));
    toc
    total_time_so_far=total_time_so_far+sum(toc)
end
fprintf('- Complete  test in %4.4fsec or %4.4fmins\n',total_time_so_far,total_time_so_far/60);

当 N=100 在 16gig i7 机器上时,这需要 162.7963 秒或 2.7133 分钟才能完成 运行ning ubuntu

有没有办法找出 N 应该是什么值才能在不同的机器上最快达到 运行?

PS:我在 16gig i7 ubuntu14.04 上 运行ning Octave 3.8.1,但即使是 1 gig 运行ning raspberry pi 2.

这是我用来对每个参数计时的Matlab测试脚本。 return 用于在第一次迭代后打破它,因为它看起来像其余的迭代相似。

%example use random values
clear all;
t=rand(1,556790);
inner_freq=rand(8193,6);

N=100; % use N chunks
nn = int32( linspace(1, length(t)+1, N+1) );
aa_sig_combined=zeros(size(t));

D = diag(inner_freq(1:end-1,2));
for ii=1:N
    ind = nn(ii):nn(ii+1)-1;
    tic;
    cosPara = 2 * pi * A * t(ind);
    toc;
    cosResult = cos( cosPara );
    sumParaA = D * cosResult;
    toc;
    sumParaB = repmat(inner_freq(1:end-1,3),[1 length(ind)]);
    toc;
    aa_sig_combined(ind) = sum( sumParaA + sumParaB );
    toc;
    return;
end

输出结果如下。请注意,我的电脑很慢。

Elapsed time is 0.156621 seconds.
Elapsed time is 17.384735 seconds.
Elapsed time is 17.922553 seconds.
Elapsed time is 18.452994 seconds.

如您所见,cos 操作花费了这么长时间。您在 8192x5568 矩阵(45,613,056 个元素)上 运行ning cos,这需要这么长时间。

如果您希望提高性能,请使用 parfor,因为看起来每次迭代都是独立的。假设您有 100 个内核来 运行 您的 100 次迭代,您的脚本将在 17 秒 + parfor 开销内完成。

cos 计算中,您可能想查看是否存在另一种方法来计算一个值的 cos 比股票方法更快、更并行。

另一小优化是这一行。它确保 diag 函数不会在循环内调用,因为对角矩阵是常数。你不希望每次都生成一个 8192x8192 的对角矩阵吧!我只是将它存储在循环之外,它也提供了一点性能提升。

D = diag(inner_freq(1:end-1,2));

请注意,我没有使用 Matlab 配置文件,因为它对我不起作用,但您将来应该使用它来编写更多功能代码。