2013-11-22 13 views
5

Çift çekirdekli 3 GHz Intel işlemcimde ortalama 250 ms'de çalışan bir algoritma var ve bunu optimize etmeye çalışıyorum. Şu anda, ortalama 50ms alarak, std::vector s 150 ve 300 arasında yaklaşık 6.000 kez çağrılan bir std::nth_element çağrı var. Ben, şu anda iki double s bir vektörden bakar ve basit bir < karşılaştırma yapar, kullandığım karşılaştırıcıyı optimize etmek için biraz zaman geçirdim. Karşılaştırıcı, std::nth_element'u çalıştırmak için zamanın ihmal edilebilir bir kısmını alır. Karşılaştırıcının kopya kurucusu da basittir.SIMD std :: nth_element Uygulaması

Bu çağrı şu anda algoritmamın% 20'sini alıyor ve zaman çoğunlukla yazmam için nth_element kodunda harcanıyor (örneğin, karşılaştırıcı değil). SIMD'yi veya başka bir yaklaşımı kullanarak nth_element'u optimize etmenin bir yolu nedir? OpenCL ve çoklu thread kullanarak some questions'u std::nth_element'a paralel olarak gördüm, fakat vektörler oldukça kısa olduğundan, bu yaklaşıma ne kadar fayda sağlayacağımı bilmiyorum, ancak yanlış olduğuma söylüyorum.

Bir SSE yaklaşımı varsa, SSE4.2'ye (geçerli, sanırım) kadar herhangi bir SSE talimatını kullanabilirim.

Teşekkürler!

+0

Bazı kodlar gönderebilir misiniz? ne yapmaya çalışıyorsun? –

+0

@ BЈовић _something_ gönderebilirim, ancak ne kadar yararlı olacağından emin değilim. Birkaç bin satır kodum var ve hepsini optimize etmeye çalışıyorum. Bu bir vizyon algoritması. Ne görmek istersin? – anjruu

+0

Evet, burada daha fazla içeriğe ihtiyacımız var. Bir çift minik vektörel çiftin var, ve onları bir sebepten dolayı sıralamaya mı çalışıyorsun? Nihai hedefin nedir? –

cevap

3

İki düşünceler:

  1. Multithreading muhtemelen herhangi bir tek vektörü için işlenmesini hızlandırmak olmaz, ancak vektörlerin sayısı büyük büyüdükçe size yardımcı olabilir.

  2. Sıralama sorunlarınız için çok güçlü bir araçtır: vektörün tüm sırasını hesaplıyorsunuz, ancak en önemsiz olanlardan başka bir şey umursamıyorsunuz. Her bir vektör için kaç elemanın en iyi% 5'i oluşturduğunu biliyorsunuz, bu yüzden bir dizgesini geçirmeniz gereken her şeyi sıralamak yerine dizinin içinden geçirin ve k en büyüğünü bulun. Bunu, k ekstra alan ile O(n) zaman yapabilirsiniz, bu yüzden muhtemelen genel bir kazanç.

İlgili konular