NumPy çekirdeğinde np.add çağrısının C ve SIMD seviyesindeki işleyişi incelendi
Öne çıkanlar
- np.add çağrısı 22 farklı döngü barındıran bir ufunc nesnesi tarafından karşılanıyor.
- Bitişik bellek düzenine sahip dizilerde NpyIter atlanarak doğrudan tek bir C döngüsü çalıştırılıyor.
- Aralıklı bellek adımları SIMD optimizasyonunu devre dışı bırakarak işlem süresini 2,6 kat uzattı.
Sayısal Python ekosisteminin en sık kullanılan işlemlerinden np.add fonksiyonunun Python katmanından C ve SIMD çekirdeklerine uzanan çalışma mekanizması detaylandırıldı. İki float64 dizisinin toplanması sürecinde çağrı, sıradan bir Python fonksiyonu yerine bir numpy.ufunc nesnesi üzerinden karşılanıyor. Süreç ilk olarak argümanların ayrıştırılması ve üçüncü taraf kütüphanelerin araya girmesini sağlayan geçersiz kılma mekanizmasının kontrol edilmesiyle başlıyor.
İşlemin devamında NumPy, veri tiplerine uygun döngüyü seçmek için tip yükseltme ve dağıtım adımlarını işletiyor. Bellek düzeni bitişik ve boyutları uyumlu dizilerde ağır NpyIter mekanizması atlanarak doğrudan tek bir C fonksiyonu çağrılıyor. Bu aşamada Python genel kilit mekanizması (GIL) devreden çıkarılıyor ve kayan nokta durum bayrakları sıfırlanarak işlemciye doğrudan erişim sağlanıyor.
Çalışmanın donanım boyutunda ise döngülerin derleme sırasında şablonlar aracılığıyla üretildiği ve içe aktarma anında işlemci özelliklerine göre SIMD optimizasyonlu varyantların seçildiği aktarıldı. Yapılan testlerde, bellek adımları aralıklı olan dizilerin SIMD vektörleştirmesini kaçırarak standart skaler döngüye düşmesi nedeniyle 2,6 kat yavaşladığı tespit edildi.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.