我不确定这是数学(代数)问题还是编程问题。
我有一个嵌套循环(在着色器程序中),它做这样的事情(L和B是只读的):
for each L in (L1, L2)
Q=L
for each B in (B1, B2, B3)
Q *= B
result += Q
所以这个循环的结果是:
result += L1*B1*B2*B3 + L2*B1*B2*B3
这是正确的结果,但B的访问速度较慢,L的访问速度较快。因此,在内部循环中对B进行迭代要比在内循环中对L进行迭代慢得多(我在上面的每个B中读取两次,每个L读取一次)。
如果我们天真地颠倒内部/外部循环,
for each B in (B1, B2, B3)
Q=B
for each L in (L1, L2)
Q *= L
result += Q
当然,这个结果变成了
result += B1*L1*L2 + B2*L1*L2 + B3*L1*L2
我在这里每个B都读了一次,但这个结果是错误的。我需要L1*B1*B2*B3
形式的产品。我知道我可以创建一个数组Q[2]
,只需执行以下操作:
对于每个LQ[i]=Li//保存在数组中
然后迭代B:
for each B in (B1, B2, B3)
for i = 1..2
Q[i] *= B
result += Q[i]
这就产生了
result += Q[1]*B1*B2*B3 + Q[2]*B1*B2*B3
这是正确的,但如果L
很大(确实如此),这是对内存的"位*"浪费。我想知道我是否可以在没有中间L[]
数组的情况下用代数方法来完成这项工作。
*Pun预期
一种没有嵌套循环的方法:
result = 0
for each L in (L1, L2)
result += L
for each B in (B1, B2, B3)
result *= B
因为
L1*B1*B2*B3 + L2*B1*B2*B3
降低到
B1*B2*B3*(L1+L2)
我可能把问题弄错了,但L1*B1*B2*B3 + L2*B1*B2*B3
不等于(L1+L2)*B1*B2*B3
吗?