У меня есть 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;
мое единственное предположение исключения потенциально с плавающей точкой, которые введены побочные эффекты
Какой компилятор, какие флаги оптимизации? – 2010-04-23 18:52:11
Пожалуйста, положите кусок '...' в свой код. Это может быть важно. –
Можете ли вы опубликовать полную версию, которая показывает проблему? Если я заполню цикл, чтобы выполнить от, скажем, «i = 0» до «i = 10000» и вызывать его из пустого 'main', gcc, похоже, оптимизирует все (за исключением корректировки указателя стека назад и вперед - не знаю, почему это оставляет это :)) –