【发布时间】:2011-05-16 22:33:17
【问题描述】:
我有这个 C 代码:
for (k = 0; k < n_n; k++) {
if (k == i || k == j) continue;
dd=q2_vect[k]-q1_vect;
d2=dd*dd;
if (d2<0) {
a=1;
break;
}
}
出于编译器优化的原因(在 Cell 处理器的 SPE 上),我需要手动解循环,所以我尝试了:
dd=q2_vect[0]-q1_vect;
d2=dd*dd;
if (d2<0)goto done;
dd=q2_vect[1]-q1_vect;
d2=dd*dd;
if (d2<0)goto done;
dd=q2_vect[2]-q1_vect;
d2=dd*dd;
if (d2<0)goto done;
.....
.....
// end
goto notdone;
done:
ok=0;
notdone:
.....
但是我不知道怎么处理
if (k == i || k == j) continue;
事实上,lopp 取决于“n_n”上的每次运行,并且我应该手动编写代码多次,以达到最大值“n_n”的值。
您认为如何解决?
【问题讨论】:
-
序列
if d2<0是无效的C. -
即使你添加了必要的括号,一个好的编译器也会优化整个 if 语句,因为 C 语言没有定义它可能为真的条件。 (代码似乎试图依赖未定义的行为。)
-
不正确:
dd == _Imaginary_I->dd*dd == -1.0这是有效的 C. -
对不起,我打错了,是 d2>0
-
所以您正在寻找除
i或j之外的第一个索引,其中d2不为零?你为什么要乘法得到d2?然后条件等价于q2_vect[k]!=q1_vect...
标签: c optimization loops unroll