2008-09-23 20 views
13

Bazı kodları yazıyorum ve SIMD intrinsics SSE2/3 kullanarak hızlandırmaya çalışıyorum. Benim kodum böyle bir doğaya sahip, bu yüzden bir veriyi bir XMM kaydına yüklemem ve bir çok defa hareket etmem gerekiyor. Oluşturulan assembler koduna baktığımda, GCC'nin XMM0 ve XMM1'de başka bir şeyi yeniden yüklemek için verileri belleğe geri çekmeye devam ettiği görülüyor. X86-64 için derledim, bu yüzden 15 kaydım var. GCC neden sadece iki tane kullanıyor ve daha fazla kullanmasını istemek için ne yapabilirim? Bir kayıtta "değeri" tutabileceğim bir yol var mı? "Kayıt" anahtar kelimemi değişken tanımıma ekledim, ancak oluşturulan derleme kodu aynı.GCC, intrinsics kullanırken ikiden fazla SIMD kaydı kullanmak için nasıl kullanılır?

+0

Aynı sorunu yaşıyorum, ARM ile. Kullandığım sözdizimi AFAICT doğru - GCC belgelerinde belirtilenle eşleşiyor. Ancak, aynı hatayı alıyorum ... En son KİK'lerin bu bağlamda takıldığını merak ediyorum. –

+0

Ah - özür dilerim - yorum aslında florin'in aşağıdaki cevaba yaptığı açıklamada açıkladığı problemle ilgili olarak (asm ("regname") kullanarak bir hata üretir). –

+1

Bu davranışın ortak bir nedeni optimizasyonlar (-O1, -O2 veya -O3) sağlayan, optimizasyonlar olmadan intrinsik kullanırken bellek her zaman floş olacak ve esas olarak sadece 2-3 simd registerları kullanacaktır – jtaylor

cevap

3

Evet, yapabilirsiniz. Explicit Reg Vars, bir değişkeni belirli bir kayda bağlamak için gereken sözdizimini anlatır.

+0

Denedim kayıt * __m128i v0 asm ("xmm7"); << ama derleyici bundan hoşlanmaz >> hata: beklenen '=', ',', ';', 'asm' veya '__attribute__' önce 'asm' <<. – florin

+0

#include mu? –

2

Her intrinsik için ayrı ayrı yazmaçları belirttiğiniz noktaya ulaşıyorsanız, derleme dizini de yazabilirsiniz, özellikle de gcc'nin birçok durumda gereksiz yere iç karartıcılıktan kaçınma alışkanlığı vardır.

İlgili konular