【发布时间】:2010-04-23 18:48:32
【问题描述】:
我有 C/C++ 代码,看起来像这样:
static int function(double *I) {
int n = 0;
// more instructions, loops,
for (int i; ...; ++i)
n += fabs(I[i] > tolerance);
return n;
}
function(I); // return value is not used.
编译器内联函数,但它不会优化n 操作。
我希望编译器能够识别出该值永远不会仅用作 rhs。
是否有一些副作用阻止优化?
编译器好像没关系,我试过intel和gcc。积极优化,-O3
谢谢
更完整的代码(完整代码是此类块的重复):
280 // function registers
281 double q0 = 0.0;
282 double q1 = 0.0;
283 double q2 = 0.0;
284
285 #if defined (__INTEL_COMPILER)
286 #pragma vector aligned
287 #endif // alignment attribute
288 for (int a = 0; a < int(N); ++a) {
289 q0 += Ix(a,1,0)*Iy(a,0,0)*Iz(a,0,0);
290 q1 += Ix(a,0,0)*Iy(a,1,0)*Iz(a,0,0);
291 q2 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,1,0);
292 }
293 #endif // not SSE
294
295 //contraction coefficients
296 qK0 += q0*C[k+0];
297 qK1 += q1*C[k+0];
298 qK2 += q2*C[k+0];
299
300 Ix += 3*dim2d;
301 Iy += 3*dim2d;
302 Iz += 3*dim2d;
303
304 }
305 Ix = Ix - 3*dim2d*K;
306 Iy = Iy - 3*dim2d*K;
307 Iz = Iz - 3*dim2d*K;
308
309 // normalization, scaling, and storage
310 if(normalize) {
311 I[0] = scale*NORMALIZE[1]*NORMALIZE[0]*(qK0 + I[0]);
312 num += (fabs(I[0]) >= tol);
313 I[1] = scale*NORMALIZE[2]*NORMALIZE[0]*(qK1 + I[1]);
314 num += (fabs(I[1]) >= tol);
315 I[2] = scale*NORMALIZE[3]*NORMALIZE[0]*(qK2 + I[2]);
316 num += (fabs(I[2]) >= tol);
317 }
318 else {
319 I[0] = scale*(qK0 + I[0]);
320 num += (fabs(I[0]) >= tol);
321 I[1] = scale*(qK1 + I[1]);
322 num += (fabs(I[1]) >= tol);
323 I[2] = scale*(qK2 + I[2]);
324 num += (fabs(I[2]) >= tol);
325 }
326
327
328 return num;
我唯一的猜测是潜在的浮点异常,它引入了副作用
【问题讨论】:
-
哪个编译器,什么优化标志?
-
请将
...部分放入您的代码中。这可能很重要。 -
你能发布一个完整的版本来显示问题吗?如果我填写循环以从
i=0运行到i=10000并从否则为空的main调用它,gcc 似乎优化了所有内容(除了来回调整堆栈指针 - 不确定为什么它会留下这个:)) -
另一方面,您可能想要
fabs(I[i]) > tolerance,而不是fabs(I[i] > tolerance)。前者检查 I[i] 的绝对值是否大于容差,后者测试有符号值并在 0 或 1 上执行不必要的fabs()。 -
我可能独自一人,但这是我没有用的优化,我希望人们不会被引导去期待。人们是否编写复杂的代码只是为了看看编译器是否足够聪明不编译它?如果我写这样的东西,我宁愿如果编译器做了什么,它应该给我一个严厉的警告。
标签: c++ c optimization compiler-construction