Bir performans darboğaz var. Büyük dizilerin sütun-bilge ortalamasını (250 satır & 1,3 milyon sütun) hesaplıyorum ve uygulamada bir milyondan fazla kez yapıyorum. PythonYüksek performanslı dizi ortalama
Benim test durumu:
import numpy as np
big_array = np.random.random((250, 1300000))
%timeit mean = big_array.mean(axis = 0) # ~400 milliseconds
Numpy tek çekirdek üzerinde çalışan, benim makinede yaklaşık 400 milisaniye sürer. Farklı dillerden (Cython, R, Julia, Torch) farklı matrix kütüphaneleri denedim, ancak sadece Julia'yı Numpy'yi yenmek için 250 milisaniyeye ulaşarak buldum.
Bu görevde performansta önemli gelişmeler olduğuna dair herhangi bir kanıt var mı? Belki bu GPU için uygun bir görev midir?
Düzenleme: Uygulamam hafızada kısıtlı ve performansı, büyük bir dizinin öğelerine tekrar tekrar değil, yalnızca bir kez erişerek önemli ölçüde geliştirildi. (Aşağıya bakınız.)
Bu hesaplama, büyük olasılıkla CPU işleminden ziyade bellek erişimi hakkında daha fazladır. Burada herhangi bir sistemin önemli ölçüde geliştirilmesini beklemezdim. Sezgim, çoklu çekirdek veya GPU kullanmanın çok fazla kullanılmayacağıydı. Şamandıraya düşürülmesi32 yardımcı olabilir. – MRocklin
Test durumu çok basit olabilir. Dizi türüm aslında boolean olacak, bu yüzden her öğe Numpy ile bir bayt olarak saklanır. Paradoksal olarak, örnek olarak floatlardan ziyade boole dizisi için ortalama veya toplamı almak daha uzun sürer. Bellek trafiğini ~% 90 azaltacak olan bitpacked dizisinde nasıl işlem yapılacağı hakkında bir fikriniz var mı? –
Benim özel uygulamasında, 22.000 satırlık dizinin 250 satırlık alt kümeleri olan dizilerin ortalamasını aldım. Bellek tüm hesaplama için tek başına toplam 24+ saate erişir. Bununla birlikte, daha büyük matris üzerinde çalışır ve her bir öğeye yalnızca bir kez dokunursak, bellek toplam 10 saniyeden daha azına erişir. Bunu denemek zorundayım! Darboğaz işaret için teşekkürler @MRocklin. –