gpt4 book ai didi

performance - ppval的高效替代品

转载 作者:行者123 更新时间:2023-12-05 03:15:21 26 4
gpt4 key购买 nike

我有一个循环,在该循环中我使用 ppval 从分段多项式样条中计算一组值。插值很容易成为循环中最耗时的部分,我正在寻找一种提高函数效率的方法。

更具体地说,我使用有限差分方案来计算摩擦焊缝中的 transient 温度分布。为此,我需要在每个时间步重新计算 Material 属性(作为温度和位置的函数)。速率限制因素是这些值的插值。我可以使用替代的有限差分方案(时域限制较少),但如果可能的话,我宁愿坚持使用现有的方案。

我在下面包含了一个 MWE:

x=0:.1:10;
y=sin(x);
pp=spline(x,y);
tic
for n=1:10000
x_int=10*rand(1000,1);
y_int=ppval(pp,x_int);
end
toc

plot(x,y,x_int,y_int,'*') % plot for sanity of data

Elapsed time is 1.265442 seconds.

编辑 - 我应该提一下,我对值之间的简单线性插值非常满意,但 interp1 函数比 ppval 慢

x=0:.1:10;
y=sin(x);
tic
for n=1:10000
x_int=10*rand(1000,1);
y_int=interp1(x,y,x_int,'linear');
end
toc

plot(x,y,x_int,y_int,'*') % plot for sanity of data

Elapsed time is 1.957256 seconds.

最佳答案

这很慢,因为您遇到了 JIT 的最烦人的限制。这是 SO 上的 MATLAB 标签中很多很多很多问题的原因:

MATLAB 的 JIT 加速器无法加速调用非内置函数的循环。

ppvalinterp1不是内置的(检查 type ppvaledit interp1 )。它们的实现并不是特别慢,只是放在循环中时速度并不快。

现在我的印象是它在最新版本的 MATLAB 中变得越来越好,但是“内联”和“非内联”循环之间仍然存在很大差异。为什么他们的 JIT 不通过简单地递归到非内置函数来自动执行此任务,我真的不知道。

无论如何,要解决这个问题,您应该将 ppval 中发生的事情的本质复制粘贴到循环体中:

% Example data
x = 0:.1:10;
y = sin(x);
pp = spline(x,y);


% Your original version
tic
for n = 1:10000
x_int = 10*rand(1000,1);
y_int = ppval(pp, x_int);
end
toc


% "inlined" version

tic

br = pp.breaks.';
cf = pp.coefs;

for n = 1:10000

x_int = 10*rand(1000,1);

[~, inds] = histc(x_int, [-inf; br(2:end-1); +inf]);

x_shf = x_int - br(inds);
zero = ones(size(x_shf));
one = x_shf;
two = one .* x_shf;
three = two .* x_shf;

y_int = sum( [three two one zero] .* cf(inds,:), 2);
end
toc

分析器:

enter image description here

在我那破机器上的结果:

Elapsed time is 2.764317 seconds.  % ppval
Elapsed time is 1.695324 seconds. % "inlined" version

差异实际上小于我的预期,但我认为这主要是由于 sum() - 对于这种 ppval 情况,我通常只需要每次迭代评估一个单个站点,您可以在没有histc(但使用简单的向量化代码)和矩阵/向量乘法x*y( BLAS) 而不是 sum(x.*y)(快,但不是 BLAS-fast)。

哦,减少 ~60% 还不错 :)

关于performance - ppval的高效替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com