2010-10-16 15 views
6

iOS 4'te kullanıma sunulan Accelerate çerçevesini inceliyorum. Özellikle Cblas rutinlerini C'deki lineer cebir kitaplığımda kullanmaya çalıştım. Şimdi yapabilirim. Çok temel rutinler üzerinde performans artışı sağlamak için bu işlevlerin kullanılmasını sağlayın. Özellikle, 4x4 matris çarpımı durumu.iOS 4 4x4 matrisli Cblas'ı hızlandırın

float *mat4SetMat4Mult(const float *m0, const float *m1, float *target) { 
    target[0] = m0[0] * m1[0] + m0[4] * m1[1] + m0[8] * m1[2] + m0[12] * m1[3]; 
    target[1] = ...etc... 
    ... 
    target[15] = m0[3] * m1[12] + m0[7] * m1[13] + m0[11] * m1[14] + m0[15] * m1[15]; 
    return target; 
}

Cblas eşdeğer fonksiyon çağrısıdır:

cblas_sgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, 
    4, 4, 4, 1.f, m0, 4, m1, 4, 0.f, target, 4);

karşılaştırılması Ben afin veya bir matris homojen özelliklerinin kullanılmasını gelemedi gidersem gideyim, bu rutini (özet) kullanarak oldum Bu ikisi, rastgele sayılarla dolu çok sayıda önceden hesaplanmış matrisler üzerinden çalışarak (her fonksiyon her seferinde aynı girişi alır), Cblas rutini C clock() fonksiyonu ile zamanlandığında yaklaşık 4x daha yavaş çalışır.

Bu bana doğru görünmüyor ve bir yerlerde yanlış bir şey yaptığımı hissediyorum. Cihazın NEON birimini ve SIMD işlevini bir şekilde etkinleştirmek zorunda mıyım? Ya da böyle küçük matrislerle daha iyi performans elde etmeyi ummamalı mıyım? Çok çok takdir

,

Bastiaan

cevap

4

BLAS ve LAPACK kitaplıkları, "orta büyüklükteki matrisler" için düşünürdüğüm şeylerle (bir taraftan onlardan on binlerce) yararlanacak şekilde tasarlanmıştır. Daha küçük matrisler için doğru sonuçlar vereceklerdir, ancak performans olabildiğince iyi olmayacaktır.

Bunun birkaç nedeni vardır: en iyi performansı, 3x3 ve 4x4 matris işlemleri sağlamak üzere

  • bir kütüphanede, satır içine yerleştirilmiş olmalıdır; Bir işlev çağrısı yapmanın yükü, yapılması gereken çok az iş olduğunda üstesinden gelmek için çok büyüktür.
  • En yüksek performansı sağlamak için tamamen farklı bir arabirim kümesi gereklidir. Matris için BLAS arabirimi, matrislerin ve depolama düzeninin aktarılıp aktarılmayacağını belirtmemekle birlikte, hesaplamada yer alan matrislerin boyutlarını ve öncü boyutlarını belirtmek için değişkenleri alır. Tüm bu parametreler kütüphaneyi güçlü kılar ve büyük matrisler için performansa zarar vermez.Ancak, 4x4 hesaplama yaptığınızı belirleyen zamana kadar, 4x4 matris işlemleri yapmaya adanmış bir işlev ve başka hiçbir şey tamamlanmamıştır.

Bu sizin için ne anlama geliyor? Sağlanan küçük matris işlemlerine sahip olmak istiyorsanız, lütfen bugreport.apple.com adresine gidin ve bu özelliği isteyen bir hata iletin.

+0

Bunun için çok teşekkür ederim. Üç gün boyunca bunu takip ettim, matris işlemlerimin hiçbiri, basit döngülerde olduğu gibi vDSP ile neden hiç hızlı olmadığımı anlamaya çalışıyorum. Sadece bir boyutta büyük olan matrisler için bile geçerli gibi görünüyor (benim durumumda, 4x10.000 matris). –

+0

@RobNapier: meraktan dolayı, bu matriste hangi işlemleri yapıyorsunuz? Ayrıca, hangi donanımı kullanıyorsunuz ve tek veya çift duyarlık mı kullanıyorsunuz? –

+0

Özellikle matris çarpımı. Bézier eğri noktalarını ve normal değerlerini çok hızlı bir şekilde hesaplamak için farklı yollar deniyorum. Optimizasyon yaptığım belirli işlev için http://robnapier.net/blog/equations-matrices-accelerate-607 adresine bakın. Bu sadece akademik bir projedir, bu yüzden bu tür problemlerin etrafında yolumu öğrenebilirim. Blogda vDSP ile açıklanan matrisi seçmeyi denedim, ancak çalışmanın çoğunu el ile yapmak için çok daha hızlı buldum (t^2 ve t^3 hariç, vDSP_vsq/vDSP_vmul ile çok daha hızlı.). Kaynakları öğrenmek için işaretçiler bekliyoruz. –

5

Elma WWDC2010 sunumları hala hatta bir 3x3 matris işlemi için bir hıza vermelidir hızlandırın demek, bu yüzden 4x4 hafif bir iyileşme göreceksiniz farz olurdu. Ancak, göz önünde bulundurmanız gereken bir şey de, Accelerate & NEON'un, tamsayı işlemlerini büyük ölçüde hızlandırmak için tasarlanmış olması, ancak kayan nokta işlemleri gerektirmemesidir. CPU işlemcinizden bahsetmediniz ve bu, Accelerate'ın CPU'nuza bağlı olarak kayan noktalı işlemler için NEON veya VFP kullanacağı anlamına geliyor. 32-bit şamandıra işlemleri için NEON komutlarını kullanırsa, hızlı çalışmalıdır, ancak 32-bit şamandıra ya da 64-bit çifte işlemler için VFP kullanırsa, çok yavaş çalışır (VFP aslında SIMD olmadığı için). Bu nedenle Accelerate ile 32-bit float işlemleri kullandığınızdan emin olmalısınız ve VFP yerine NEON kullanacağından emin olmalısınız.

Ve başka bir sorun, NEON kullanmasa bile, C derleyicinizin basit C işlevinden NEON yönergeleri olmadan daha hızlı NEON kodu üreteceğinin bir garantisi yoktur, çünkü GCC gibi C derleyicileri genellikle korkunç SIMD kodu üretir potansiyel olarak standart koddan daha yavaş çalışıyor. Bu nedenle, oluşturulan kodun hızını test etmek ve muhtemelen derleyicinizin hatalı kod oluşturup oluşturmadığını görmek için oluşturulan derleme koduna elle bakmak her zaman önemlidir.

+0

Lütfen StackOverflow üzerinde imza kullanmayın, ayrıntılar için [SSS girişi] bölümüne bakın (http://stackoverflow.com/faq#signatures). –

+0

İmzalamadığın için teşekkürler, kötü olduğunu bilmiyordum! –

İlgili konular