2014-09-04 11 views
7

gcc (ultime versioni: 4.8, 4.9) hanno una clausola "assume" simile a __assume() integrata supportata da icc? E.g., __assume(n % 8 == 0);Clausola "Assume" in gcc

+3

Vedere: '__builtin_expect'? https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html –

+0

Sembra che sia per la previsione del ramo, ho bisogno di suggerire al vettore che il numero di cicli è un buon numero. – user2052436

+0

Non ho accesso a icc, è lo stesso di Visual C __assume()? (http://msdn.microsoft.com/en-us/library/1b3fsfxw.aspx) –

risposta

9

A partire da gcc 4.8.2, non esiste un equivalente di __assume() in gcc. Non so perché - sarebbe molto utile. suggerito da mafso:

#define __assume(cond) do { if (!(cond)) __builtin_unreachable(); } while (0) 

Questo è un vecchio trucco, noto almeno fino al 2010 e probabilmente più lungo. Il compilatore di solito ottimizza la valutazione di "cond" perché qualsiasi valutazione per la quale cond è falsa sarebbe comunque indefinita. Tuttavia, non sembra ottimizzare "cond" se contiene una chiamata a una funzione opaca (non in linea). Il compilatore deve supporre che la chiamata opaca potrebbe avere un effetto collaterale (ad esempio, cambiare un globale) e non può ottimizzare la chiamata, anche se potrebbe ottimizzare qualsiasi computazione e ramificazione sul risultato. Per questo motivo, l'approccio macro è una soluzione parziale, nel migliore dei casi.

+1

Oltre a questo problema, anche in gcc 5.2 e 6.1. cond non viene ottimizzato quando l'espressione sottostante è opaca. Anche se cond è racchiuso in una pura funzione, che si penserebbe che il compilatore sarebbe libero di ottimizzare. Inoltre non ho ancora trovato un modo per rilevare se il compilatore ottimizza le cond. Il che significa che è possibile fare del male alle prestazioni usando questa macro facendo in modo che il compilatore aggiunga silenziosamente codice non necessario. Con l'espressione trasparente la macro funziona molto bene però. – user377178