HMS Accelerate Kit’e Giriş ,Multithreading önemi ve Proje Üzerinde Uygulanması

Cenk Türker
7 min readJun 23, 2021

--

Herkese merhaba, Bu yazımda sizlere Accelerate Kit’in ne olduğunu, hangi amaçlarla kullanılabileceğini, avantajlarını, temel yeteneklerini, entegrasyon sürecini ve proje üzerinde nasıl uygulanacagını anlatacağım.

Genel Bakış

HUAWEI Accelerate Kiti, daha iyi uygulama performansını kolaylaştırmak için çok iş parçacıklı hızlandırma ve bilgi işlem hızlandırma çözümleri sunmaktadır. Günümüzde gelişen teknolojinin birçok alanında kullanılmaktadır. Ek olarak, Accelerate Kit, HMS Core 5.0 sürüm’ünde piyasaya sürülen bir yeniliktir.

HMS Core 5.0

5.0.0.300 sürümündeki Yeni Özellikler

Kolaylaştırılmış uygulama performansı için yerel katmanda çok iş parçacıklı bir programlama çerçevesi sağlamak için “multithreading-library” fonksiyonu eklenmiş olarak görüyoruz.

Multithreading-library kavramı

Ne yapar bu “multithread-library” diye sorarsak.. Sisteminizin size sunduğu kaynakları en verimli şekilde kullanabilmek adına çok çekirdekli donanım üzerinde yapılacak görevlerinizin sıraya alma ve yürütme işleri için gerekli API’ları sağlamaktadır.”Queue” mantığını esas alarak ,ilk giren-ilk çıkar(FIFO)yöntemi ile çalışmaktadır.

Multithreading nedir?

Çoklu okuma, birden çok yazılım dili için temel programlama ilkesidir ve bir programda aynı anda birden çok işin yapılmasını sağlar.

Multi-Threading

Başka bir deyişle, bir kod parçası bir işlemi gerçekleştirirken, başka bir kod parçasının da onunla paralel olarak çalıştığı anlamına gelir. Çok iş parçacıklı bir yapıya sahip olmayan programlar, ana iş parçacığı adlı bir iş parçacığı tanımlar.

Accelerate Kit’e Giriş

HUAWEI Accelerate Kit, birden çok iş parçacığının eşzamanlı yürütülmesini verimli bir şekilde iyileştiren çok iş parçacıklı hızlandırma yeteneği sağlar. İşletim sisteminde çekirdeğin üzerinde bulunur ve bir dizi C dili API’si olarak geliştiricilere sunulmaktadır.

Accelerate Kit’in Temel Yetenekleri

Hızlandırma Kiti, birçok geliştiricinin iş parçacığı aşırı yüklemesini ve uygulama performansı sorunlarını kolayca analiz etmesine yardımcı olmak için gelişmiş çok iş parçacıklı programlama ve bilgi işlem hızlandırma çözümlerini sağlar.

Accelerate Kit

Böylece Geliştiriciler, uygulama performansını iyileştirmek için çok çekirdekli CPU iş parçacığını ve bilgi işlem yeteneklerini etkili bir şekilde kullanabilir.

Mantıksal Mimarisi

Aşağıdaki tablo, bize HMS Core için Accelerate kit’inin mantıksal mimarisini anlatıyor.

Accelerate Kit Mantıksal Mimarisi

Mevcut Android cihazların çoğu çok çekirdekli bir sistem kullanıyor. Sisteme tam donanımlı bir oyun vermek için birden fazla görevi aynı anda yürütebilen programlar tercih edilir. Genel olarak, iş parçacıklarını yöneterek yerel katman kontrol görevinin yürütülmesinde çok iş parçacıklı programlar. Accelerate Kit, multi-thread library kullanarak yeni bir çok iş parçacıklı programlama yöntemi sağlar. Sizi iş parçacığı yönetimi ayrıntılarından kurtarır, böylece sistemin çok çekirdekli donanım kapasitesini tam olarak kullanabilen uygulamalar geliştirmeye odaklanabilirsiniz ve daha verimli çalışma vaat eder.

Güçlü Yönleri Nelerdir?

Kolay Kullanım: Uygulamaya odaklanmanıza olanak tanıyan basit ve zengin çok iş parçacıklı programlama arabirimi sağlar.
Yüksek Performans: Çok çekirdekli ve çoklu iş parçacığı yetenekleri, çoklu iş parçacığı performansını% 10 ile % 20 oranında geliştirmek için tamamen kullanılır.
Yüksek Verimlilik: Sistem kaynaklarını dengeler ve planlar ve sistem güç tüketimini azaltır.

Mainstream Multi-Thread Programlama

Huawei, kendi “Huawei multi-thread kütüphanesi” ile ana çok iş parçacıklı programlama olarak “C / C ++” kullanır.
Olumlu yön olarak yüksek performanslı ve kullanımı kolay API’ler diyebiliriz.
ancak olumsuz yön olarak şimdilik “Java arayüzü” yok ama önümüzdeki dönemler içerisinde geleceği öngörülmektedir.

Bağımlılıklar(Interdependencies)

Aşağıdaki tabloda, Accelerate Kit’in belirtilen işlev, bağımlılık, Android Sürümü ve Donanım Uyumluluğu ile karşılıklı bağımlılıklarını görebilirsiniz.

Accelerate Kit Bağlılıkları

Kullanım Durumları

Yüksek performans gereksinimleri olan çoğu uygulama “C / C ++” kullanılarak yerel katmanda geliştirilir. Ancak yerel katman, olgun bir çok iş parçacıklı programlama çerçevesinden yoksundur.

Multithread çalıştırılan bir oyun
  • Eşzamanlı görev yürütme
  • Görevlerin seri olarak yürütülmesi
  • Görevlerin senkronizasyonu

Örneğin, oyun endüstrisinde çoklu iş parçacığı kullanımı yaygındır. Oyun sahnesinde eş zamanlı olarak bulunduğunuz karakter içerisinde ateş edebilir, koşabilir ve yön hareketlerini gerçekleştirebilirsiniz.

Ayrıca şu alanlarda kullanılabilir;

  • Fotoğraf ve video (HDR, 4K videolar)
  • Eğlence (HD Kod Çözme)
  • AR / VR Görüntü güzelleştirme, iyileştirme

Geliştirme Öncesi Adımlar

Nelere İhtiyacınız Olacak

Donanım Gereksinimleri

  • Windows, Linux veya Mac bilgisayar (masaüstü veya dizüstü bilgisayar)
  • Android cep telefonu (USB bağlantı destekli)

Yazılım Gereksinimleri

  • Java JDK 1.7 veya üstü
  • Android Studio 3.x yada üstü
  • Android 5.0 yada sonrası
  • Gradle 4.6 veya üstü

Gerekli Bilgiler

  • C dili temelleri
  • C’de çok iş parçacıklı programlama

Desteklenen Cihazlar

Android işletim sistemine sahip her akıllı telefon ve tablet ,Android 5.0 veya sonraki bir sürümü çalıştırılabilir ancak HMS Core Sürümü belirsizliğini korumaya devam ediyor.

Entegrasyon Hazırlıkları

Huawei Accelerate Kit entegrasyon sürecinde tamamlamamız gereken bazı adımlar var. Bunlar;

  1. Geliştirici olarak kaydolun.
  2. Bir Android Studio projesi oluşturun.
  3. Bir imzalama sertifikası parmak izi oluşturun.
  4. İmza sertifikası parmak izini yapılandırın.

Geliştirme Kılavuzu” nda daha ayrıntılı olarak inceleyebilirsiniz.

HMS Core SDK’nın Entegrasyonu

Öncelikle bir android “Native C ++” projesi oluşturmanız gerekir.
Bundan sonra, proje dizinindeki /app/build.gradle dosyasına “NDK build” için aşağıdaki satırları eklemelisiniz:

arguments “-DANDROID_STL=c++_shared”: multithread-lib, libc++’a bağlıdır. Bu nedenle, c++_shared’in CMake derleme parametrelerinde bildirilmesi gerekir. Aksi takdirde, bazı işlevler çalışmayacaktır.

abiFilters “arm64-v8a”, “armeabi-v7a”: multithread-lib yalnızca arm64-v8a ve armeabi-v7a’yı destekler.

jniLibs.srcDirs = [‘libs’]: .so dosyalarının dizinini belirtir.

Aşağıdaki tabloda, gerekli alanı gösterildiği gibi ekleyebilirsiniz.

NDK build

SDK İndirme ve Kitaplıklar

SDK dosyasında proje için ihtiyaç duyduğunuz bazı kütüphaneler bulunmaktadır. SDK İndir i indirmek için tıklayabilirsiniz.

SDK’yı indirdikten sonra, SDK’daki başlık dosyalarını kaynak kitaplığına kopyalayın. Android Studio projesindeki / app dizininde bir “include” klasörü oluşturun. SDK’nın / include dizinindeki dosyaları yeni oluşturulan klasörün içerisine kopyalayın.

Include File

SDK’daki .so dosyalarını kaynak kitaplığına kopyalayın.

/ App dizininde bir “libs” klasörü oluşturun ve / app / libs dizininde bir “arm64-v8a” klasörü ve bir “armeabi-v7a” klasörü oluşturun.

SDK’nın “lib64 ” dizinindeki “libdispatch.so” , “libdispatch_stat.so” ve libBlockRuntime.so’yu Android Studio’nun “ libs / arm64-v8a8a” dizinine kopyalayın.

SDK’nın / lib dizinindeki “libdispatch.so” “libdispatch_stat.so” ve “libBlockRuntime.so” dosyalarını Android Studio’nun “/ libs / armeabi-v7a” dizinine kopyalayın.

In libs file

İşte bu, artık hazırsınız kütüphaneniz ateşlemeye hazır.

Geliştirme kısmından önceki son adımda ise app / src / main / cpp dizininde “CMakeLists.txt” dosyasında küçük bir kısmını değiştireceğiniz bazı dosyalar aşağıdaki gibidir.

Ekleme, düzeltme ve diğer ilgili parametreler gibi tüm değişiklikler aşağıda açıklanmıştır:

  • target_include_directories: multi-thread library başlık dosyalarının dizinini ekler.
  • add_library/set_target_properties:multithread-lib ile ilgili .so dosyalarını ekler. Yalnızca libdispatch.so ve libBlocksRuntime.so’nun eklenmesi gerekir. libdispatch_stat.so, dlopen kullanılarak libdispatch.so’ya otomatik olarak eklenir.
  • target_compile_option: -fblocks derleme seçeneğini ekler.
  • target_link_libraries: .so dosyalarının bağımlılığını ekler.

Kod Geliştirme Bölümü

Kod geliştirme bölümünde, Accelerate Kit API ile “The Gregory-Leibniz sonsuz serisini” kullanarak aşağıdaki gibi “π” hesaplamasına yönelik talimatlar sağlamaktadır:

The Gregory-Leibniz infinite series formülü

“Gregory-Leibniz sonsuz dizisi” de neymiş dediğinizi duyar gibiyim. Biliyor musunuz bende sizin gibi aynı tepki vermiştim ilk duyduğumda.

Buraya Gregory-Leibniz sonsuz serisinin ne olduğunu anlatan küçük bir video koydum. Hakkında bilgi sahibi olmak için geliştirmeye başlamadan önce izlemenizi öneririm.

Leibniz Formula ile pi videosu

Adım adım kod blokları

1-Terim sayısı (n), toplam görev sayısı (threads) ve hesaplama sonucunun başlatılması (pi) dahil olmak üzere ilgili parametreleri atamaları ve Pi’nin sonraki bir blokta güncellenmesi ve değiştirilmesi gerektiğinden, __block değiştiricisi eklenir.

2- “dispatch_queue_create” Π hesaplaması için bir seri kuyruk oluşturmak adına çağırılmaktadır. Ardından, “dispatch_apply” komutu ile belirlediğimiz görevi, kuyrukta birden çok kez eşzamanlı olarak yürütmek için çağırırız. Genel olarak, belirtilen kuyruğu, önceliği mevcut kuyruğa en yakın olan global eşzamanlı kuyruk olan “DISPATCH_APPLY_AUTO” olarak ayarlamanız önerilir.

3-Π hesaplama algoritmasını uygulayın. Yani, ** n ** terimlerini iş parçacığı görevlerine ayırın (thread = 8). Her görevin başlangıcı ve bitişi, geçerli görevin bu örnekte 0, 1,… veya 7 olan görev kimliğine (idx) göre hesaplanır. flag, her terimin artı veya eksi sembolünü gösterir. Sum, geçerli görevin toplam sonucunu gösterir.

4- 8 thread’in işlemi tamamlandığında her görevin toplamını hesaplamak adına dispatch_sync’i çağırırark threadler üzerindeki sonucları toplamamız gerekmektedir.

5-Gerekli thread alanını serbest bırakmak için “dispatch_release” çağırıyoruz. “Dispatch_xxx_create ()” sınıfının API’leri tarafından oluşturulan nesnelerin her biri, öbek üzerindeki bir boşluğa karşılık gelir. Özellikle bellek yönetimi için geliştirilen Garbage Collection olmadığından, kullanıcı tarafından oluşturulan bu tür nesnelerin artık gerekli olmadığını belirlediğinde proaktif olarak serbest bırakılması gerekir.

6-Π sayısını output olarak ekrana bastırırken . ,20 ondalık basamak içinde gösterilmektedir.

Accelerate π hesaplaması tamamlandı. Aşağıda tam kod (app / src / main / cpp / native-lib.cpp) verilmektedir.

7-İşte kod kısmının tamamı,buradan tekrar inceleyebilirsiniz.

pi hesaplama tüm kodlar

Tüm adımları uyguladıktan sonra, Accelerate Kit ile çok iş parçacıklı programlamayı tamamlamış olacaksınız..
Uygulamanın ekran görüntüsü çıktısını aşağıdaki gibi görebilirsiniz.

Uygulama çıktısı

Accelerate kit yazımın sonuna geldik, bu kitin multi-thread ile kullanımı, hangi alanlarda uygulama geliştirilebileceğini anlattım. Son olarak, Accelerate Kit hakkında,aşağıdaki konular hakkında bilgi sahibi olacaksınız;

  • Accelerate Kit API’lerini Kullanma,
  • Accelerate SDK’yı entegre etme,
  • Accelerate Kit API’lerini çağırma

Aşağıdaki referans linkler’i üzerinden daha ayrıntılı inceleme yapabilirsiniz.

Referanslar:

https://developer.huawei.com/consumer/en/doc/development/HMSCore-Guides/introduction-0000001050980807

https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)

--

--