Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 在不使用额外内存的情况下反转嵌套循环的顺序_Optimization_Loops_For Loop_Nested_Algebra - Fatal编程技术网

Optimization 在不使用额外内存的情况下反转嵌套循环的顺序

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

我不确定这是一道数学(代数)题还是一道编程题

我有一个嵌套循环(在着色器程序中),它可以执行如下操作(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 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