Gömülü Sistemler İçin Lineer Cebir Kütüphanesi Arayışı

Başlatan Tagli, 08 Mart 2022, 10:28:53

Tagli

Özellikle Cortex M için önerdiğiniz, C veya C++'ta yazılmış bir lineer cebir kütüphanesi var mıdır? Şu anda denklem sistemi çözmek için ihtiyacım oldu. Aslında kendim de yazabilirim muhtemelen, çok zor değil. Ancak konuyu araştırdığımda, işin bazı püf noktaları olabileceğini ve hazır bir kütüphane kullanımının daha güvenli olacağını okudum.

Araştırmalarımda karşıma sıklıkla LAPACK, BLAS, Eigen kütüphaneleri, bunların türevleri ve bunların üzerine inşaa edilmiş başka kütüphaneler çıkıyor. Hatta sanırım katmanlı bir mimari söz konusu. Örneğin Armadillo diye bir kütüphane arka planda LAPACK kullanıyor ancak yapılacak işleme göre LAPACK'in alt seviye fonksiyonlarından en uygun olanları otomatik seçiyor.

Arama motorlarında sık çıkan kütüphanelerden biri de EmbeddedLapack. Gördüğüm bir sorunu (eğer yanlış anlamadıysam) sadece double türü kullanıyor oluşu. float ile işlem yapabilmek hız açısından işime gelir. Aynı sayfada aynı kişinin CControl diye bir kütüphanesine de bağlantı verilmiş. Bu daha hafif bir kütüphane ve float kullanıyor. Ancak dokümantasyonu çok zayıf ve alt seviye fonksiyonlardan hangisini kullanmam gerektiğinden emin olamadım.
Gökçe Tağlıoğlu

kantirici

Doğrudan konuya katkı sağlamayacak ama aklıma şu geldi. C++ kütüphaneleri %99 STL kullanacaklar ve buda dinamik bellek operasyonlarının oldukça fazla olması demek.
Mevcut mcu projelerinizde STL kullandınız mı? Kullandıysanız hangi bileşenleri? Özetle dinamik bellek yönetimi için özel bir yöntem kullandınız mı?

CControl ise oldukça iyi duruyor. Dİnamik bellek yok ve embedded baz alınarak geliştirildiği söylenmiş. Ayrıca proje aktif olarak geliştiriliyor görünüyor.

mr.engineer

Gömülü sistemler için aramanızın sebebi nedir? Zaten liner bir denklem sistemini çözecek metotlar belli. Denklem sistemini çözmek dışında bir şey yapmayacaksanız, bir kütüphaneye ihtiyacınız yok bence. Okuldan hatırladığım bir gauss-jordan kodu en fazla 200-300 satırdı. Onu da internetten veya bilimsel programlamayla ilgili kitaplardan bulabilirsiniz.

Tagli

Alıntı yapılan: kantirici - 08 Mart 2022, 19:48:17Mevcut mcu projelerinizde STL kullandınız mı?
Dinamik bellek kullanan bileşenlerinden kaçındım, ancak mesela array ve <algorithm> kullanıyorum. Projemde dinamik bellek kullanımı da var ancak başlangıçta bir kez yer ayırdıktan sonra silme veya tekrar yer ayırma yapmıyorum. Öte yandan, arka planda vector kullanan bir kütüphaneye bu konuda güvenmek mümkün değil.

Alıntı yapılan: mr.engineer - 08 Mart 2022, 23:07:19Gömülü sistemler için aramanızın sebebi nedir?
Çoğunlukla dinamik bellek kullanımından kaçınmak. double da sorun olacaktır. Projede STM32F4 kullanılıyor, bu sebeple sadece float ile işlem yapıp donanım desteğinden faydalanmak istiyorum. Benim durumumda bir faydası/alakası olmasa da, işlemciye özel yazılmış kütüphaneler performans açısından faydalı olabiliyor. Örneğin bu tür kütüphanelerde sıklıkla ARM Neon desteği ile ilgili kodlar görüyorum. Elbette STM32F4'te Neon yok.

Alıntı yapılan: mr.engineer - 08 Mart 2022, 23:07:19Denklem sistemini çözmek dışında bir şey yapmayacaksanız, bir kütüphaneye ihtiyacınız yok bence.
İlk mesajımda belirtmiştim, muhtemelen kendim de yazabilirdim. Uzun yıllar önce okulda ödev vermişlerdi, Fortran'da yazmıştım. Ancak internette araştırınca, hazır kütüphane kullanımının önerildiğini gördüm. Basit bir Gauss Elimination yazmakta bir sorun yok, ancak konuyla ilgili bilmediğim ayrıntılar olabilir. İlk mesajımda bahsettiğim kütüphanelerin dokümanları incelendiğinde pek çok özellik ve ayrıntıdan bahsediyor. Dediğim gibi, sadece hangi fonksiyonu kullanacağına karar vermek için bile ayrı bir kütüphane yazmışlar. Sonuçta iyi çalıştığı bilinen bir kütüphaneyi alıp kullanmak işime gelir.


Gökçe Tağlıoğlu

Tagli

Eigen'i denedim, ancak işimi görmedi. Aslında float üzerinde işlem yapabilme imkanı sağlıyor. Dinamik bellekten kaçınmak için matrisleri sabit boyutlu tanımlamak da mümkün ancak bunlar class template olarak tanımlanmış ve kodu aşırı şişiriyorlar. Bir türlü anlamadığım bir sebepten dolayı .rodata içine de fazladan ~60 kB eklendi, eklenen şeyin ne olduğunu bile bulamadım. Toplamda 80+ kB yer harcadığı gibi nedense program da çalışmadı, ben de pes ettim. Bu arada özellikle baktım, herhangi bir double kütüphanesi de eklenmemiş. Neyse, sonuçta Eigen'i eledim.

Sıradaki kütüphane muhtemelen CControl olurdu, ancak ondan önce daha kolay bir şey denemeye karar verdim: CMSIS DSP. Evet, CMSIS'de denklem sistemi çözümü için doğrudan bir fonksiyon yok. Ancak temel matris işlemleri var. Ax = B eşitliğinde A ve B biliniyor. Bu durumda A-1Ax = A-1B olacaktır. Yani x'i bulmak için tersini alma ve çarpma işlemlerini kullanmak benim için yeterli. Bunlar da CMSIS DSP içinde var. Bu arada, dokümanından anladığım kadarıyla CMSIS DSP matris tersini almak için Gauss-Jordan yöntemini kullanıyor.

Bu şekilde denedim, şimdilik bir sorun gözükmüyor. Verilen noktalardan geçen bir eğri elde etmeye çalışıyordum, amacıma ulaştım. Yeni bir gelişme olursa yine yazarım buraya.
Gökçe Tağlıoğlu

Epsilon