【发布时间】:2015-06-24 15:30:11
【问题描述】:
我正在尝试优化值 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);
在运行 ubuntu 的 16gig i7 机器上 N=100 时,这需要 162.7963 秒或 2.7133 分钟才能完成
有没有办法找出 N 应该是什么值才能让它在不同的机器上以最快的速度运行?
PS:我在 16gig i7 ubuntu 14.04 上运行 Octave 3.8.1,但它也可以在 1 gig raspberry pi 2 上运行。
【问题讨论】:
-
如果您非常关心性能,我会用 Fortran 或 C 编写循环,然后将其并行化(可能使用 OpenMP)。您也可以尝试在主循环之外预先计算一些东西,例如 length(ind) 或 inner_freq(1:end-1,1)。
-
OP 如果正确,你能接受我的回答吗?
-
@krisdestruction 我很乐意,但您的代码似乎不起作用......我在您的答案下的部分中包含了错误。我在网上多个地方和octave-online.net 一起尝试过,错误和'A'一起出现错误:运算符*:不符合要求的参数(op1 是 8192x8192,op2 是 1x5568)
标签: arrays matlab math octave mathematical-optimization