我不確定這是數學(代數)問題還是編程問題。在不使用額外內存的情況下顛倒嵌套循環的順序
我有做這樣的事情(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]
,只是做:
for each L Q[i] = Li // save in array
然後在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[]
數組,我可以用代數的方式做到這一點。
*雙關語意
這將是非常好的,只有我忽略提到B與每個L的關係必須首先被發現。讓我分析一下。 – bobobobo