Matrix 理解APL';内积
以下是《掌握Dyalog APL》一书中关于内部产品一章的摘录: 然后它说,第二个和第三个解决方案在键入的字符数和性能方面是等效的 据我所知,APL程序员通常应该尽可能多地使用内部产品和外部产品。对吗 你能举一个例子,当使用内积会导致性能的提高吗?当我使用内积(在较低的层次上)时,会发生什么?下面介绍的第一个解决方案是因为没有正确地使用APL语法而可怕,还是因为它的性能更差Matrix 理解APL';内积,matrix,matrix-multiplication,apl,dyalog,Matrix,Matrix Multiplication,Apl,Dyalog,以下是《掌握Dyalog APL》一书中关于内部产品一章的摘录: 然后它说,第二个和第三个解决方案在键入的字符数和性能方面是等效的 据我所知,APL程序员通常应该尽可能多地使用内部产品和外部产品。对吗 你能举一个例子,当使用内积会导致性能的提高吗?当我使用内积(在较低的层次上)时,会发生什么?下面介绍的第一个解决方案是因为没有正确地使用APL语法而可怕,还是因为它的性能更差 我知道有几个问题,但我想问的是,一般来说,内部/外部产品是如何工作的,APL程序员应该在什么时候使用它们,但根据经验,我认
我知道有几个问题,但我想问的是,一般来说,内部/外部产品是如何工作的,APL程序员应该在什么时候使用它们,但根据经验,我认为使用内部和外部产品将有利于可读性和性能;-) 现在,看看实践中的情况: `]performance.RunTime(3600×HMS[1])+(60×HMS[2])+HMS[3]-重复次数=100000
- 基准测试“(3600×HMS[1])+(60×HMS[2])+HMS[3]”,重复次数=100000次 费用 CPU(平均值):0.001558503836 已用时间:0.001618446292 ]performance.RunTime'+/3600 60 1×HMS'-repeat=100000
- 基准测试“+/3600 60 1×HMS”,重复次数=100000 费用 CPU(平均值):0.0004698496481 已用时间:0.0004698496481 `
- 基准测试“3600 60 1+.×HMS”,重复次数=100000
费用
CPU(平均值):0.0004698496481
已用时间:0.000439859245
`
+/v1 × v2 → 6.0E¯5 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
v1 +.× v2 → 6.3E¯5 | +5% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
我原以为较大的参数将有助于使最后一个表达式的性能优势更加明显,但实际上#2赢了。也许Dyalog优化了案例#2多于#3…-)
APL程序员通常应该尽可能多地使用内部产品和外部产品。对吗
这实际上取决于APL程序员和手头的任务,但如果有什么东西使APL代码更简洁、更高效,我不明白程序员为什么不选择它
在这种特殊情况下60⊥HMS
比内部产品更加简洁高效
你能举一个例子,当使用内积会导致性能的提高吗
在面向阵列的编程中,性能的提高是通过一次性完成任务来实现的。
大多数APL函数都是隐式循环——它们的实现使用一个计数器、一个限制和一个增量步长。
代码越短越好,因为它不仅更容易记住,而且解释器对数据的传递次数越少,效率也就越高。
一些实现会进行循环融合,以减少这种开销。
有些具有习语识别能力——某些波形的组合在口译员中是特殊情况。一次性完成任务还允许解释器进行巧妙的优化,如使用SSE指令集或GPU
回到内积,让我们以A f.g B
为例,其中A
和B
是向量,看看f
和g
是如何应用的(在Dyalog中):
从上面可以看出,对f
和g
的调用是交错的。解释器在一次过程中同时应用f
和减少g
,避免像f/agb
那样创建临时数组
另一个例子:
您可以自己测试不同解决方案的性能,看看哪种解决方案效果最好:
)copy dfns.dws cmpx
⍝ or: ")copy dfns cmpx" if you are using Windows
HMS ← 3 44 29
cmpx '(3600×HMS[1]) + (60×HMS[2]) + HMS[3]' '+/ 3600 60 1 × HMS' '3600 60 1 +.× HMS' '60⊥HMS'
(3600×HMS[1]) + (60×HMS[2]) + HMS[3] → 2.7E¯6 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
+/ 3600 60 1 × HMS → 9.3E¯7 | -66% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
3600 60 1 +.× HMS → 8.9E¯7 | -68% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
60⊥HMS → 4.8E¯7 | -83% ⎕⎕⎕⎕⎕⎕⎕
我们已经完成了优化+/和+.× MBaas是正确的,因为在本例中,+/比+.× 我们的一般建议是:使用最适合该工作的语言构造,最终实现将迎头赶上 “可怕”的解决方案被认为是不好的,因为它没有使用数组思维 问候,
Vince,Dyalog支持部门嗨,Vince-很高兴在这里见到你;-)“可怕”的解决方案很好地理解了要倒退必须做什么,即用C或其他标量语言重写一些APL代码。
f←{⎕←(⍕⍺),' f ',⍕⍵ ⋄ ⍺+⍵}
g←{⎕←(⍕⍺),' g ',⍕⍵ ⋄ ⍺×⍵}
0 1 2 3 4 f.g 5 6 7 8 9
4 g 9
3 g 8
24 f 36
2 g 7
14 f 60
1 g 6
6 f 74
0 g 5
0 f 80
80
)copy dfns.dws cmpx
⍝ or: ")copy dfns cmpx" if you are using Windows
HMS ← 3 44 29
cmpx '(3600×HMS[1]) + (60×HMS[2]) + HMS[3]' '+/ 3600 60 1 × HMS' '3600 60 1 +.× HMS' '60⊥HMS'
(3600×HMS[1]) + (60×HMS[2]) + HMS[3] → 2.7E¯6 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
+/ 3600 60 1 × HMS → 9.3E¯7 | -66% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
3600 60 1 +.× HMS → 8.9E¯7 | -68% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
60⊥HMS → 4.8E¯7 | -83% ⎕⎕⎕⎕⎕⎕⎕