2014-09-04 30 views
7

gcc (en son sürümler: 4.8, 4.9) icc tarafından desteklenen __assume() benzeri bir "varsayım" yan tümcesi var mı? E.g., __assume(n % 8 == 0);"Assume" deyimi, gcc'de

+3

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

+0

Şube tahmini için olduğu gibi, ilmek sayısının iyi bir sayı olduğu için vektörleştiriciyi ima etmem gerekiyor. – user2052436

+0

icc'ye erişimim yok, Visual C __assume() ile aynı mı? (http://msdn.microsoft.com/en-us/library/1b3fsfxw.aspx) –

cevap

9

gcc 4.8.2'den itibaren, gcc'de __assume() eşdeğeri yoktur. Nedenini bilmiyorum - çok yararlı olur. mafso önerilir:

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

Bu, en az 2010 kadar ve muhtemelen daha uzun süredir bilinen eski bir numaradır. Derleyici genellikle 'koşul' değerlendirmesini en iyi duruma getirir, çünkü hangi koşulun yanlış olduğuna dair herhangi bir değerlendirme zaten tanımlanmayacaktır. Ancak, bir opak (satır içi olmayan) işleve bir çağrı içeriyorsa, 'kondisyonu' en iyi duruma getirme gibi görünmemektedir. Derleyici, opak aramanın bir yan etkiye sahip olabileceğini (örn., Global olarak değiştirebileceğini) varsaymalıdır ve sonuca göre herhangi bir hesaplamayı ve şubeyi optimize edebilmesine rağmen, çağrıyı en iyi duruma getiremez. Bu nedenle, makro yaklaşım en iyi ihtimalle kısmi bir çözümdür.

+1

Gcc 5.2 ve 6.1'de de bu konuya baktı. Altta yatan ifade opak olduğunda, koşul optimize edilmez. Cond, salt işleve sarılı olsa bile, derleyicinin uzaklaşmak için özgür olacağını düşünebilirsiniz. Ayrıca derleyicinin kondisyonu optimize edip etmediğini tespit etmem için henüz bir yol bulamadım. Bu, gereksiz bir kod ekleyerek derleyici oluşturarak bu makroyu kullanarak performansa zarar vermenin mümkün olduğu anlamına gelir. Şeffaf ifade ile makro çok iyi çalışır. – user377178