2011-02-11 33 views
11

Herkese selam :) Kayan nokta, SIMD/matematik intrinsik ve gcc için hızlı-matematik bayrağı ile ilgili birkaç kavram asmak çalışıyorum. Daha spesifik olarak, x86 işlemci üzerinde gcc v4.5.0 ile MinGW kullanıyorum.gcc, simd intrinsics ve hızlı matematik kavramları

şimdi bir süre etrafta aradık, ve ben (I düşünmek) şu anda anlıyorum ne: Hiçbir bayraklarıyla derlerken

, herhangi fp kodu standart x87 olacak, hiçbir SIMD intrinsics, ve math.h işlevleri msvcrt.dll dosyasından bağlanır. Ayrıca bazı optimizasyon bayrakları belirtirseniz ben mfpmath kullanmak

, mssen ve/veya böylece mmx/sse/avx kod etkinleştirilecek olan mart, gcc aslında On gibi SIMD talimat sadece kullanır veya ftree-vectorize. Bu durumda intrinsikler gcc tarafından otomatik olarak seçilir ve bazı matematik fonksiyonları (hala math.h'deki standart matematik fonlarından bahsederim) intrinsik hale gelir veya inline koduyla optimize edilir, bazı diğerleri hala msvcrt'den gelir. dll. En iyileştirme bayraklarını belirtmezsem, bu değişikliklerden herhangi birini yapar mı? Belirli SIMD veri türlerini kullandığınızda

(v4si veya v8qi gibi gcc uzantıları olarak kullanılabilir olanlar,), doğrudan içsel Funcs arayın veya yeniden gcc için automagic kararı ayrılma seçeneğine sahip. Doğru işaretler aracılığıyla simd yönergelerini etkinleştirmezseniz Gcc hala standart x87 kodunu seçebilir. Yine, optimizasyon bayrakları belirtmezsem, bu değişikliklerden herhangi birini yapar mı?

Plese benim ifadelerden herhangi yanlış varsa düzeltin: p

Şimdi soru:

  1. şimdiye intrinsics kullanmak x86intrin.h dahil etmek var mı?
  2. Libm'yi hiç bağlamak zorunda mıyım?
  3. Hızlı matematik herhangi bir şeyle ne ilgisi var? Anladığım kadarıyla IEEE standardını rahatlatıyor, özellikle de nasıl? Diğer standart fonksiyonlar kullanılıyor? Başka bir lib bağlı mı? Ya da sadece bir yerdeki bayraklar bir çift ve standart lib farklı davranıyor mu? yardım edecek kimseye

Teşekkür: D

+0

üzerinde gcc kılavuzu 3. bir örnek için buraya bakın: http://stackoverflow.com/questions/4956033/multiply-by-0-optimization – Anycorn

cevap

6

Tamam, benim gibi bu kavramları kavramak için biraz mücadele ediyor herkes için ansewring ediyorum. Kod, FPU veya sse her türlü üzerinde öküz çalışmaları ile

Optimizasyonları

hızlı matematik yalnızca x87 koduna çalışıyor gibi görünüyor. Ayrıca, fpu denetim sözcüğünü değiştirdiği görülmez. O_O

Her zaman dahili olarak dahil edilir. Bu davranış, bazı yerleşikler için, katı veya hiç yerleşik olmayanlar gibi bazı bayraklarla önlenebilir.

The libm.glibc'de bulunmayan bazı şeyler için kullanılır, ancak mingw ile sadece bir kukla dosyadır, bu nedenle şu anda bu bağlantıyı kurmak işe yaramamaktadır

Gcc'nin özel vektör türlerini kullanmak yalnızca Doğrudan intrinsik, aksi takdirde kod zaten vectorized olur.

Herhangi düzeltme karşılandı :)

Faydalı linkler:
fpu/sse control
gcc math
ve "Vektör Uzantıları", "X86 fonksiyonları Yerleşik" ile "Diğer yerleşiklerinden"

+0

gcc şu anda v4.7'deyim, sonunda yazdığım gibi, herhangi bir düzeltme hala memnuniyetle karşılanmaktadır:) – rocket441

+0

32 bit x86 üzerindeki gcc için '-msse2' veya' kullanmalısınız. -march = SSE/SSE2 matematiğinin kullanılmasını sağlar. Daha sonra derleyicinin onu kullanmasını sağlamak için '-mfpmath = sse' komutunu kullanırsınız. x86-64 üzerinde gcc zaten varsayılan olarak float/double için SSE/SSE2 kullanır, çünkü ABI X87 kayıtlarında değil, XMM kayıtlarında float ve double args iletir ve döndürür. –