C++ Programlama Dili: cstd::execution: Eşzamansız algoritmalar

Adanali

Active member
C++ Programlama Dili: cstd::execution: Eşzamansız algoritmalar


  1. C++ Programlama Dili: cstd::execution: Eşzamansız algoritmalar

Genel düşünceye göre std::execution Önceki blog yazımda kendimi özelleştirilebilir asenkron algoritmalara adadım.


Duyuru









P2300R10 teklifini sunmak kolay değil. Birincisi güçlüdür, ikincisi ise çok uzundur. Bu nedenle bazı yönlere odaklanıyorum.








Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.







C++ modelinin öncelikleri


Teklif için bazı öncelikler geçerlidir. Eşzamansız kod için C++ modeli şunları içermelidir:

  • Birleştirilebilir ve genel olabilir, kullanıcıların birçok farklı türde yürütme kaynağıyla kullanılabilecek kod yazmasına olanak tanır.
  • Yaygın eşzamansız kalıpları özelleştirilebilir ve yeniden kullanılabilir algoritmalar halinde özetleyin, böylece kullanıcıların her şeyi kendilerinin icat etmesine gerek kalmaz.
  • inşaat yoluyla doğru olmayı kolaylaştırır.
  • Tüm yürütme aracıları aynı olmadığından, yürütme kaynaklarının ve yürütme aracılarının çeşitliliğini destekleyin; bazıları diğerlerinden daha az güçlüdür ancak daha az önemli değildir.
  • Diğer yürütme kaynaklarına aktarım da dahil olmak üzere her şeyin bir yürütme kaynağı tarafından özelleştirilmesine izin verir, ancak her şeyi özelleştirmek için yürütme kaynaklarına ihtiyaç duymaz –
    tüm hassas kullanım örneklerini, etki alanlarını ve platformları göz önünde bulundurun.
  • hataların aktarıldığından emin olun ancak hata yönetiminin bir yük olmadığından emin olun.
  • bir hata olmayan medya sonlandırması.
  • İşlerin nerede yapıldığına dair açık ve kesin yanıtlara sahip olmak.
  • Nesne yaşam sürelerini eşzamansız olarak işleyebilir ve sonlandırabilir.
Yürütme kaynağı, yürütme aracısı ve zamanlayıcı terimleri anlaşılması açısından önemlidir. std::execution gerekli. İşte ilk basitleştirilmiş tanımlar.

A Yürütme kaynağı bir dizi yürütme aracısını yöneten program kaynakları birimidir. Yürütme kaynaklarına örnek olarak etkin iş parçacığı, iş parçacığı havuzu veya ek donanım hızlandırıcı verilebilir.

Her işlev çağrısı bir aradadır Yönetici ajanlar uygulanmış.

A Planlayıcı bir yürütme kaynağının, söz konusu kaynak üzerinde çalışmayı planlamak için genel, birleşik bir arayüze sahip bir soyutlamasıdır. Burası bir verici fabrikası.

Selam Dünya


İşte “Merhaba Dünya” programı std::execution. Bu sefer program Compiler Explorer'da çalıştırılabilir ve analizim daha derinlere inecektir.


// HelloWorldExecution.cpp

#include <exec/static_thread_pool.hpp>
#include <iostream>
#include <stdexec/execution.hpp>


int main() {
exec::static_thread_pool pool(8);
auto sch = pool.get_scheduler();

auto begin = stdexec::schedule(sch);
auto hi = stdexec::then(begin, [] {
std::cout << "Hello world! Have an int.n";
return 13;
});
auto add_42 = stdexec::then(hi, [](int arg) { return arg + 42; });

auto = stdexec::sync_wait(add_42).value();

std::cout << "i = " << i << 'n';
}


Öncelikle programın çıktısı şu şekilde:








Program gerekli başlıkları ekleyerek başlar:exec/static_thread_pool.hpp> bir iş parçacığı havuzu oluşturmak için estdexec/execution.hpp> yürütmeyle ilgili yardımcı programlar için.

içinde main Fonksiyon aktif olacak static_thread_pool pool sekiz iş parçacığı ile oluşturulmuştur.

Üye işlevi get_scheduler iş parçacığı havuzunun bir kısmı, çağrılan yürütme kaynağı zamanlayıcısına hafif bir tanıtıcı sağlamak için çağrılır sch iş parçacığı havuzundaki gönderenleri planlamak için kullanılır. Bu durumda, yürütme kaynağı bir iş parçacığı havuzudur ancak aynı zamanda ana iş parçacığı, GPU veya bir görev çerçevesi de olabilir.

Program daha sonra yürütme aracıları tarafından yürütülen bir dizi gönderici oluşturur.

İlk istasyon begin fonksiyonla çalışacak stdexec::schedule belirtilen zamanlayıcıda bir gönderen oluşturdu sch planlar. stdexec::schedule sözde verici fabrikasıdır. Başka verici fabrikaları da var. Bir sonraki standardın ad alanını kullanıyorum:

Sonraki istasyon hi Verici adaptörünü kullanın stdexec::thenverici hangisi begin ve lambda fonksiyonunu kullandık. Bu lambda işlevi şunu döndürür: “Hello world! Have an int.” konsola gider ve tamsayı değerini döndürür 13 Geriye. Üçüncü istasyon add_42 ayrıca verici adaptörüyle birlikte gelir stdexec::then yarattı. Devam filmi devraldı hi Görev ve tam sayı argümanına sahip başka bir lambda arg alır ve eklenmesinin sonucu 42 geri döner. Göndericiler eşzamansız olarak çalışır ve genellikle oluşturulabilir.

std::execution vericiler için ek adaptörler sunar:


execution::continues_on
execution::then
execution::upon_*
execution::let_*
execution::starts_on
execution::into_variant
execution::stopped_as_optional
execution::stopped_as_error
execution::bulk
execution::split
execution::when_all


Göndericiden farklı olarak gönderen-tüketici senkronize çalışır. THE stdexec::sync_wait-Çağrının tamamlanması bekleniyor add_42-verici. THE valueYöntemin sonucu için kullanılır. sync_wait Gönderen tarafından oluşturulan ve değişkene aktarılan değeri almak için çağrılır i ambalajı açıldı.

this_thread::sync_wait yürütme çerçevesindeki tek gönderen tüketicidir.

Bir sonraki adım nedir?


Bir sonraki yazımda daha karmaşık bir algoritmayı analiz edeceğim.


(Ben)
 
Üst