0

これが数学 (代数) の質問なのか、プログラミングの質問なのかわかりません。

次のようなことを行う入れ子になったループ (シェーダー プログラム内) があります (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を 2 回読み取り、各 L を 1 回読み取ります)。

内部/外部ループを単純に逆にすると、

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 を 1 回ずつ読みましたが、この結果は間違っています。の形の製品が必要ですL1*B1*B2*B3。私は配列を作成できることを知っていて、次のことをQ[2]行うだけです:

Lごとに
  Q[i] = L i // 配列に保存

次に、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[]中間配列なしで代数的にこれを行うことができるかどうか疑問に思っています。

*しゃれ意図

4

2 に答える 2

2

ネストされたループがない方法:

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)

于 2012-08-31T18:08:41.707 に答える
0

私は質問を間違って間違っているかもしれませんが、L1*B1*B2*B3 + L2*B1*B2*B3等しくありません(L1+L2)*B1*B2*B3か?

于 2012-08-31T18:09:28.360 に答える