Optimization 在不使用额外内存的情况下反转嵌套循环的顺序
我不确定这是一道数学(代数)题还是一道编程题 我有一个嵌套循环(在着色器程序中),它可以执行如下操作(L和B是只读的): 所以这个循环的结果是:Optimization 在不使用额外内存的情况下反转嵌套循环的顺序,optimization,loops,for-loop,nested,algebra,Optimization,Loops,For Loop,Nested,Algebra,我不确定这是一道数学(代数)题还是一道编程题 我有一个嵌套循环(在着色器程序中),它可以执行如下操作(L和B是只读的): 所以这个循环的结果是: 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
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]
,只需执行以下操作:
for each L
Q[i] = Li // save in array
给
result += Q[1]*B1*B2*B3 + Q[2]*B1*B2*B3
这是正确的,但如果L
很大(它很大),则会造成内存的“位*”浪费。我想知道我是否可以在没有中间L[]
数组的情况下以代数方式完成这项工作
*双关语是一种没有嵌套循环的方式:
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
这真是太好了,只是我忘了提到B和L的关系必须先找到。让我考虑一下。
result += Q[1]*B1*B2*B3 + Q[2]*B1*B2*B3
result = 0
for each L in (L1, L2)
result += L
for each B in (B1, B2, B3)
result *= B