Mesaj Geçiş Arayüzü - Message Passing Interface

Mesaj Geçirme Arayüzü ( MPI ), paralel bilgi işlem mimarilerinde çalışmak üzere tasarlanmış, standartlaştırılmış ve taşınabilir bir mesaj iletme standardıdır . MPI standardı, C , C++ ve Fortran'da taşınabilir mesaj iletme programları yazan çok çeşitli kullanıcılar için yararlı olan kitaplık rutinlerinin sözdizimini ve anlamını tanımlar . Birkaç vardır açık kaynak MPİ uygulamaları paralel gelişimini besleyen, yazılım endüstrisi ve taşınabilir ve ölçeklenebilir büyük ölçekli paralel uygulamaların teşvik edilmiş gelişme.

Tarih

Mesaj iletme arayüzü çalışması 1991 yazında küçük bir grup araştırmacı Avusturya'da bir dağ inziva yerinde tartışmalara başladığında başladı. Bu tartışmadan 29-30 Nisan 1992'de Williamsburg, Virginia'da düzenlenen Dağıtılmış Bellek Ortamında İleti Geçişi Standartları üzerine bir Çalıştay geldi . Williamsburg'daki katılımcılar, standart bir mesaj iletme arayüzü için gerekli olan temel özellikleri tartıştılar ve standardizasyon sürecini sürdürmek için bir çalışma grubu kurdular. Jack Dongarra , Tony Hey ve David W. Walker, Kasım 1992'de "MPI1" adlı bir ön taslak öneri sundular. Kasım 1992'de Minneapolis'te MPI çalışma grubunun bir toplantısı yapıldı ve standardizasyon sürecini daha kapsamlı bir çerçeveye yerleştirmeye karar verdi. resmi temel. MPI çalışma grubu 1993'ün ilk 9 ayı boyunca her 6 haftada bir toplandı. Taslak MPI standardı Kasım 1993'te Supercomputing '93 konferansında sunuldu. MPI'de bazı değişikliklerle sonuçlanan bir kamu yorumu döneminden sonra, sürüm 1.0. MPI Haziran 1994'te yayınlandı. Bu toplantılar ve e-posta tartışması birlikte, üyeliği yüksek performanslı bilgi işlem topluluğunun tüm üyelerine açık olan MPI Forumunu oluşturdu .

ÇBYE çalışmasına, başta Amerika Birleşik Devletleri ve Avrupa olmak üzere 40 kuruluştan yaklaşık 80 kişi katıldı. Eşzamanlı bilgisayarların büyük satıcılarının çoğu, üniversitelerden, devlet laboratuvarlarından ve endüstriden araştırmacılarla işbirliği yaparak MPI çalışmasına dahil oldu .

MPI, paralel donanım satıcılarına, verimli bir şekilde uygulanabilecek, açıkça tanımlanmış bir temel rutinler seti sağlar. Sonuç olarak, donanım satıcıları paralel makineleriyle sağlanan dağıtılmış bellek iletişim ortamı için daha yüksek düzeyli rutinler oluşturmak için bu standart düşük seviyeli rutinler koleksiyonunu geliştirebilir . MPI, temel kullanıcı için kullanımı kolay taşınabilir bir arabirim sağlar, ancak programcıların gelişmiş makinelerde bulunan yüksek performanslı mesaj iletme işlemlerini kullanmasına izin verecek kadar güçlüdür.

Mesaj iletimi için evrensel bir standart oluşturma çabası içinde, araştırmacılar bunu tek bir sistem üzerine kurmadılar , ancak IBM, Intel , nCUBE , PVM, Express, P4 ve PARMACS tarafından tasarlananlar da dahil olmak üzere birçok sistemin en kullanışlı özelliklerini birleştirdiler. . Mesaj iletme paradigması, geniş taşınabilirliği nedeniyle çekicidir ve dağıtılmış bellek ve paylaşılan bellek çok işlemcileri, iş istasyonu ağları ve bu öğelerin bir kombinasyonu için iletişimde kullanılabilir. Paradigma, ağ hızından veya bellek mimarisinden bağımsız olarak birden çok ayarda uygulanabilir.

MPI toplantıları için destek kısmen DARPA'dan ve ASC-9310330 hibesi kapsamında ABD Ulusal Bilim Vakfı'ndan (NSF), CCR-8809615 numaralı NSF Bilim ve Teknoloji Merkezi Kooperatifi anlaşmasından ve Esprit Projesi P6643 aracılığıyla Avrupa Komisyonu'ndan geldi. Tennessee Üniversitesi ayrıca MPI Forumu'na mali katkıları olmuştur.

genel bakış

MPI, paralel bilgisayarları programlamak için bir iletişim protokolüdür . Hem noktadan noktaya hem de toplu iletişim desteklenir. MPI "özelliklerinin herhangi bir uygulamada nasıl davranması gerektiğine ilişkin protokol ve anlamsal spesifikasyonlarla birlikte bir mesaj ileten uygulama programcısı arayüzüdür." MPI'nin hedefleri yüksek performans, ölçeklenebilirlik ve taşınabilirliktir. MPI, bugün yüksek performanslı bilgi işlemde kullanılan baskın model olmaya devam ediyor.

MPI, herhangi bir büyük standart kuruluşu tarafından onaylanmamıştır; bununla birlikte, dağıtılmış bir bellek sistemi üzerinde çalışan paralel bir programı modelleyen süreçler arasındaki iletişim için fiili bir standart haline gelmiştir . Bilgisayar kümeleri gibi gerçek dağıtılmış bellekli süper bilgisayarlar genellikle bu tür programları çalıştırır.

Temel MPI-1 modelinde paylaşılan bellek kavramı yoktur ve MPI-2 yalnızca sınırlı bir dağıtılmış paylaşılan bellek kavramına sahiptir. Bununla birlikte, MPI programları düzenli olarak paylaşılan bellek bilgisayarlarda çalıştırılır ve her iki MPICH ve Açık MPI Varsa ileti aktarımı için bellek paylaşılan kullanabilirsiniz. Programları MPI modeli etrafında tasarlamak (açık paylaşılan bellek modellerinin aksine ), MPI bellek yerelliğini teşvik ettiğinden NUMA mimarilerine göre avantajlara sahiptir . Açık paylaşımlı bellek programlaması MPI-3'te tanıtıldı.

MPI, OSI Referans Modelinin 5. ve daha yüksek katmanlarına ait olsa da , uygulamalar , taşıma katmanında kullanılan soketler ve İletim Kontrol Protokolü (TCP) ile çoğu katmanı kapsayabilir .

Çoğu MPI uygulaması, C , C++ , Fortran'dan (yani bir API) doğrudan çağrılabilen belirli bir rutinler kümesinden ve C# , Java veya Python dahil olmak üzere bu tür kitaplıklarla arabirim oluşturabilen herhangi bir dilden oluşur . MPI'nin eski mesaj iletme kitaplıklarına göre avantajları taşınabilirlik (çünkü MPI hemen hemen her dağıtılmış bellek mimarisi için uygulanmıştır) ve hızdır (çünkü her uygulama prensipte üzerinde çalıştığı donanım için optimize edilmiştir).

MPI, çağrılar ve dil bağlamaları için Dilden Bağımsız Belirtimleri (LIS) kullanır . İlk MPI standardı , LIS ile birlikte ANSI C ve Fortran-77 bağlamalarını belirtti. Taslak Supercomputing 1994'te (Kasım 1994) sunuldu ve kısa süre sonra sonuçlandırıldı. 2008 yılında MPI-1 serisinin son sürümü olarak yayınlanan MPI-1.3 standardını yaklaşık 128 fonksiyon oluşturmaktadır.

Şu anda standardın birkaç versiyonu vardır: mesaj geçişini vurgulayan ve statik bir çalışma zamanı ortamına sahip olan sürüm 1.3 (genellikle kısaltılmış MPI-1 ), paralel G/Ç gibi yeni özellikler içeren MPI-2.2 (MPI-2), dinamik süreç yönetimi ve uzak bellek işlemleri ve blokajsız sürümlerle toplu işlemlere uzantılar ve tek taraflı işlemlere uzantılar içeren MPI-3.1 (MPI-3). MPI-2'nin LIS'si 500'den fazla işlevi belirtir ve ISO C , ISO C++ ve Fortran 90 için dil bağlamaları sağlar . Karışık dilli mesaj iletme programlamasını kolaylaştırmak için nesne birlikte çalışabilirliği de eklendi. 1996'da tamamlanan MPI-2'yi standartlaştırmanın bir yan etkisi, MPI-1 standardını netleştirmek ve MPI-1.2'yi oluşturmaktı.

Bazı işlevler kullanımdan kaldırılmış olsa da, MPI-2 çoğunlukla MPI-1'in bir üst kümesidir. MPI-1.3 programları, MPI-2 standardıyla uyumlu MPI uygulamaları altında çalışmaya devam etmektedir.

MPI-3 , yeni Fortran 2008 bağlamalarını içerirken, kullanımdan kaldırılmış C++ bağlamalarının yanı sıra birçok kullanımdan kaldırılmış rutinleri ve MPI nesnelerini kaldırır.

MPI genellikle 1989'da geliştirilen popüler bir dağıtık ortam ve mesaj geçirme sistemi olan ve standart paralel mesaj geçişi ihtiyacını motive eden sistemlerden biri olan Paralel Sanal Makine (PVM) ile karşılaştırılır . İş parçacığı paylaşımlı bellek programlama modelleri ( Pthreads ve OpenMP gibi ) ve mesaj iletme programlaması (MPI/PVM) tamamlayıcı olarak kabul edilebilir ve örneğin birden çok büyük paylaşılan bellek düğümüne sahip sunucularda ara sıra birlikte kullanılmıştır.

işlevsellik

MPI arabirimi, bir dizi işlem (düğümler/sunucular/bilgisayar örnekleriyle eşlenmiş) arasında dile özgü sözdizimi (bağlamalar) ile dilden bağımsız bir şekilde temel sanal topoloji, senkronizasyon ve iletişim işlevselliği sağlamayı amaçlamaktadır. artı birkaç dile özgü özellik. MPI programları her zaman süreçlerle çalışır, ancak programcılar genellikle süreçlere işlemciler derler. Tipik olarak, en yüksek performans için, her bir işlemci (veya çekirdek çok çekirdekli bir makine), sadece tek bir işlem atanacaktır. Bu atama, normalde mpirun veya mpiexec olarak adlandırılan MPI programını başlatan aracı aracılığıyla çalışma zamanında gerçekleşir.

MPI kitaplığı işlevleri arasında, bunlarla sınırlı olmamak üzere, noktadan noktaya randevu tipi gönderme/alma işlemleri, Kartezyen veya grafik benzeri mantıksal işlem topolojisi arasında seçim yapma, işlem çiftleri arasında veri alışverişi (gönderme/alma işlemleri), kısmi Hesaplamaların sonuçları (toplama ve azaltma işlemleri), senkronizasyon düğümleri (bariyer işlemi) ve ayrıca bilgi işlem oturumundaki işlemlerin sayısı, bir işlemin eşlendiği mevcut işlemci kimliği, bir mantıksal topoloji vb. Noktadan noktaya operasyonları gelir senkron , asenkron , tamponlu ve hazır formlar, hem nispeten daha güçlü ve daha zayıf izin semantiğini bir buluşma-send senkronizasyon yönleri için. Çoğu uygulamada, asenkron modda birçok olağanüstü işlem mümkündür.

MPI-1 ve MPI-2, iletişim ve hesaplamayla örtüşen uygulamaları mümkün kılar, ancak uygulama ve teori farklıdır. MPI ayrıca , arayüz içinde gizli durumdan kaçınmaya yardımcı olan uyum ve birleştirme stratejilerine sahip olan iş parçacığı güvenli arayüzleri de belirtir . Çok iş parçacıklı noktadan noktaya MPI kodu yazmak nispeten kolaydır ve bazı uygulamalar bu kodu destekler. Çok iş parçacıklı toplu iletişim, en iyi şekilde, aşağıda açıklandığı gibi, Communicator'ın birden çok kopyasıyla gerçekleştirilir.

kavramlar

MPI çeşitli özellikler sunar. Aşağıdaki kavramlar, tüm bu yetenekler için bağlam sağlar ve programcının uygulama programlarında hangi işlevselliği kullanacağına karar vermesine yardımcı olur. MPI'nin sekiz temel konseptinden dördü MPI-2'ye özgüdür.

iletişimci

Communicator nesneleri, MPI oturumundaki işlem gruplarını birbirine bağlar. Her iletişimci, içerilen her sürece bağımsız bir tanımlayıcı verir ve içerdiği süreçleri sıralı bir topolojide düzenler . MPI ayrıca açık gruplara sahiptir, ancak bunlar esas olarak başka bir iletişimci yapılmadan önce süreç gruplarını organize etmek ve yeniden düzenlemek için iyidir. MPI, tek grup içi iletişim operasyonlarını ve ikili interkomünikatör iletişimini anlar. MPI-1'de tek grup işlemleri en yaygın olanıdır. İkili operasyonlar çoğunlukla toplu iletişim ve dinamik süreç içi yönetimi içerdiği MPI-2'de görünür.

İletişimciler birkaç MPI komutu kullanılarak bölümlenebilir. Bu komutlar MPI_COMM_SPLIT, her bir işlemin, kendisini o renge sahip olduğunu bildirerek birkaç renkli alt iletişimciden birine katıldığını içerir.

Noktadan noktaya temel bilgiler

Bir dizi önemli MPI işlevi, iki spesifik süreç arasındaki iletişimi içerir. Popüler bir örnek, MPI_Sendbelirli bir işlemin ikinci bir belirtilen işleme mesaj göndermesine izin veren 'dir. Noktadan-noktaya işlemleri, bu denir olarak, örneğin, bir model verilmiş ya da düzensiz iletişim özellikle yararlı olan veri paralel mimarisi içinde, belirli diğer hesaplama adımları arasında işlemci ya da bir ile her veri işlemci rutin swap bölgeler MASTER önceki görev tamamlandığında master'ın bir slave'e yeni görev verileri gönderdiği köle mimarisi.

MPI-1, hem bloke eden hem de bloke etmeyen noktadan-noktaya iletişim mekanizmaları için mekanizmaları ve ayrıca bir gönderme talebinin yalnızca eşleşen alma talebi zaten yapılmış olduğunda yapılabildiği sözde 'hazır gönderme' mekanizmasını belirtir. .

Kolektif temeller

Toplu işlevler , bir süreç grubundaki tüm süreçler arasındaki iletişimi içerir (bu, tüm süreç havuzu veya program tanımlı bir alt küme anlamına gelebilir). Tipik bir işlev MPI_Bcastçağrıdır (" yayın " kısaltması ). Bu fonksiyon bir düğümden veri alır ve süreç grubundaki tüm süreçlere gönderir. Ters işlem, MPI_Reducebir gruptaki tüm işlemlerden veri alan, bir işlem gerçekleştiren (toplama gibi) ve sonuçları bir düğümde depolayan çağrıdır. MPI_Reducegenellikle, her işlemcinin verilerin bir kısmı üzerinde çalıştığı ve ardından bunları bir sonuç olarak birleştirdiği büyük bir dağıtılmış hesaplamanın başında veya sonunda yararlıdır.

Diğer işlemler gibi daha sofistike görevleri gerçekleştirmek MPI_Alltoallrearranges hangi n veri öğeleri öyle ki n inci düğüm alır n her veri inci madde.

Türetilmiş veri türleri

Birçok MPI işlevi, işlemler arasında gönderilen veri türünü belirtmenizi gerektirir. Bunun nedeni, MPI'nin türlerin farklı düğümlerde farklı şekilde temsil edilebileceği heterojen ortamları desteklemeyi hedeflemesidir (örneğin, farklı endianness'e sahip farklı CPU mimarileri çalıştırıyor olabilirler ), bu durumda MPI uygulamaları veri dönüştürme gerçekleştirebilir . C dili bir türün kendisinin parametre olarak geçirilmesine izin vermediğinden, MPI MPI_INT, MPI_CHAR, sabitlerini , , , vb. MPI_DOUBLEile karşılık gelecek şekilde önceden tanımlar . intchardouble

İşte, inttüm işlemlerden bire s dizilerini geçiren C'deki bir örnek . Bir alıcı sürece "kök" süreci denir ve belirlenmiş herhangi bir süreç olabilir, ancak normalde süreç 0 olacaktır. Tüm süreçler dizilerini köke göndermeyi ister MPI_Gather, bu da her bir sürece sahip olmaya eşdeğerdir ( root'un kendisi) çağrısı MPI_Sendve kök, MPI_Recvtüm bu dizileri daha büyük bir dizide birleştirmek için karşılık gelen sayıda sıralı çağrı yapar:

int send_array[100];
int root = 0; /* or whatever */
int num_procs, *recv_array;
MPI_Comm_size(comm, &num_procs);
recv_array = malloc(num_procs * sizeof(send_array));
MPI_Gather(send_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
           recv_array, sizeof(send_array) / sizeof(*send_array), MPI_INT,
           root, comm);

Ancak, bunun yerine verileri 100 ints yerine tek bir blok olarak göndermek isteyebilirsiniz . Bunu yapmak için bir "bitişik blok" türetilmiş veri tipi tanımlayın:

MPI_Datatype newtype;
MPI_Type_contiguous(100, MPI_INT, &newtype);
MPI_Type_commit(&newtype);
MPI_Gather(array, 1, newtype, receive_array, 1, newtype, root, comm);

Bir sınıfı veya veri yapısını MPI_Type_create_structgeçirmek için, MPI_predefinedveri türlerinden MPI türetilmiş bir veri türü oluşturur :

int MPI_Type_create_struct(int count,
                           int *blocklen,
                           MPI_Aint *disp,
                           MPI_Datatype *type,
                           MPI_Datatype *newtype)

nerede:

  • countblok sayısıdır ve blocklen, disp, ve dizilerinin uzunluğunu (eleman olarak) belirtir type.
  • blocklen her blokta çok sayıda eleman içerir,
  • disp her bloğun bayt yer değiştirmelerini içerir,
  • type her blokta eleman türleri içerir.
  • newtype (bir çıktı), bu işlev tarafından oluşturulan yeni türetilmiş türü içerir

disp(Yer değiştirme) dizi için gerekli olan veri yapısı hizalama , derleyici bir ped, bir sınıf veya veri yapısında değişkenler. Farklı alanlar arasındaki mesafeyi bulmanın en güvenli yolu, adreslerini bellekte almaktır. Bu, MPI_Get_addressnormalde C'nin &operatörüyle aynı olan ancak bellek segmentasyonu ile uğraşırken doğru olmayabilir .

Bir veri yapısını bir blok olarak geçirmek, özellikle işlem tekrarlanacaksa, her seferinde bir öğeyi geçmekten önemli ölçüde daha hızlıdır. Bunun nedeni, sabit boyutlu blokların aktarım sırasında serileştirme gerektirmemesidir .

Aşağıdaki veri yapıları göz önüne alındığında:

struct A {
    int f;
    short p;
};

struct B {
    struct A a;
    int pp, vp;
};

MPI'den türetilmiş bir veri türü oluşturmak için C kodu:

static const int blocklen[] = {1, 1, 1, 1};
static const MPI_Aint disp[] = {
    offsetof(struct B, a) + offsetof(struct A, f),
    offsetof(struct B, a) + offsetof(struct A, p),
    offsetof(struct B, pp),
    offsetof(struct B, vp)
};
static MPI_Datatype type[] = {MPI_INT, MPI_SHORT, MPI_INT, MPI_INT};
MPI_Datatype newtype;
MPI_Type_create_struct(sizeof(type) / sizeof(*type), blocklen, disp, type, &newtype);
MPI_Type_commit(&newtype);

MPI-2 kavramları

Tek taraflı iletişim

MPI-2 tanımlar, üç tek taraflı iletişim işlemleri, MPI_Put, MPI_Getve MPI_Accumulateuzak bellek, uzak bellek bir okuma ve sırasıyla görevlerin, bir dizi için aynı belleğinde bir indirgeme işlemi için bir yazma olmak. Spesifikasyon, bu işlemlerin bir senkronizasyon noktasına kadar gerçekleştiğini garanti etmediğinden, bu iletişimi senkronize etmek için (genel, ikili ve uzak kilitler) üç farklı yöntem de tanımlanmıştır.

Bu tür çağrılar, senkronizasyonun uygun olmadığı (örneğin dağıtılmış matris çarpımı ) veya diğer işlemciler veriler üzerinde çalışırken görevlerin yüklerini dengeleyebilmesinin istendiği algoritmalar için genellikle yararlı olabilir .

Dinamik süreç yönetimi

Kilit nokta, "bir MPI sürecinin yeni MPI süreçlerinin oluşturulmasına katılma veya ayrı olarak başlatılan MPI süreçleriyle iletişim kurma yeteneği"dir. MPI-2 spesifikasyonu, MPI süreçlerinin dinamik olarak iletişim kurabileceği üç ana arayüzü tanımlar, MPI_Comm_spawn, MPI_Comm_accept/ MPI_Comm_connectve MPI_Comm_join. MPI_Comm_spawnArayüz Bir MPI süreç adında MPI sürecinin birçok durumu yumurtlamaya sağlar. Yeni oluşturulan MPI süreçleri seti, yeni bir MPI_COMM_WORLDintracommunicator oluşturur, ancak ebeveyn ve fonksiyonun döndürdüğü intercommunicator ile iletişim kurabilir. MPI_Comm_spawn_multipleoluşturulan farklı örneklerin farklı argümanlara sahip farklı ikili dosyalar olmasına izin veren alternatif bir arayüzdür.

G/Ç

Paralel G/Ç özelliği bazen MPI-IO olarak adlandırılır ve dağıtılmış sistemlerdeki G/Ç yönetimini MPI'ye soyutlamak ve mevcut türetilmiş veri türü işlevselliğini kullanarak dosyalara desenli bir şekilde kolayca erişilmesine izin vermek için tasarlanmış bir dizi işlevi ifade eder. .

Bu özellik üzerinde yapılan küçük araştırmalar, MPI-IO kullanarak yüksek performans kazanımları elde etmenin önemsiz olmayabileceğini gösteriyor. Örneğin , MPI G/Ç kitaplığını kullanan bir seyrek matris-vektör çarpımı uygulaması, genel bir küçük performans kazancı davranışı gösterir, ancak bu sonuçlar kesin değildir. MPI-IO'nun yaygın bir şekilde benimsenmesi, MPI-IO'ya uygulanan toplu I/O fikrine kadar değildi. Toplu G/Ç, süreçlerin toplu olarak küçük ve bitişik olmayan G/Ç işlemlerini büyük ve bitişik olanlara dönüştürmesini sağlayarak uygulamaların G/Ç bant genişliğini önemli ölçüde artırır, böylece kilitleme ve disk arama yükünü azaltır . Geniş performans avantajları nedeniyle MPI-IO, HDF5 ve Parallel NetCDF gibi birçok son teknoloji G/Ç kitaplığı için temel G/Ç katmanı haline geldi . Popülaritesi ayrıca, yerleşime duyarlı G/Ç ve çapraz dosya toplama gibi toplu G/Ç optimizasyonları üzerine araştırmaları tetikledi.

Resmi uygulamalar

Diğer pek çok çaba MPICH, LAM ve HP , Intel , Microsoft ve NEC'in ticari uygulamaları dahil ancak bunlarla sınırlı olmamak üzere diğer çalışmaların türevleridir .

Spesifikasyonlar bir C ve Fortran arabirimini zorunlu kılarken, MPI'yi uygulamak için kullanılan dil, çalışma zamanında desteklemek istediği dil veya dillerle eşleşmekle sınırlı değildir. Çoğu uygulama C, C++ ve montaj dilini birleştirir ve C, C++ ve Fortran programcılarını hedefler. Perl, Python, R, Ruby, Java ve CL dahil olmak üzere diğer birçok dil için bağlamalar mevcuttur (bkz. #Language bağlamaları ).

ABI MPI uygulamaları kabaca bir aileden bir kitaplık bir damla-in aynı aileden birinin yedek olarak çalışır böylece, MPICH ve OpenMP türevleri arasında bölünür, ancak aileleri arasında doğrudan yedek imkansızdır. Fransız CEA , bu tür anahtarları kolaylaştırmak için bir sarmalayıcı arabirime sahiptir.

Donanım

MPI donanım araştırması, örneğin bellekteki işlemci aracılığıyla MPI'yi doğrudan donanımda uygulamaya , MPI işlemlerini her düğümdeki RAM yongalarının mikro devrelerine oluşturmaya odaklanır . Dolaylı olarak, bu yaklaşım dilden, işletim sisteminden ve CPU'dan bağımsızdır, ancak kolayca güncellenemez veya kaldırılamaz.

Diğer bir yaklaşım, MPI kuyruklarının donanımsal olarak işlenmesi ve CPU veya işletim sistemi çekirdeği müdahalesi olmaksızın bellek ile ağ arabirimi arasında doğrudan veri aktarımı için RDMA kullanılması dahil olmak üzere, işlemin bir veya daha fazla bölümüne donanım hızlandırma eklemek olmuştur .

Derleyici sarmalayıcıları

mpicc (ve benzer şekilde mpic++ , mpif90 , vb.), MPI kullanan kodu derlerken gerekli komut satırı bayraklarını ayarlamak için mevcut bir derleyiciyi saran bir programdır. Tipik olarak, kodun derlenmesini ve MPI kitaplığına karşı bağlanmasını sağlayan birkaç bayrak ekler.

Dil bağlamaları

Bağlamalar , MPICH veya Open MPI gibi mevcut bir MPI uygulamasını sararak MPI desteğini diğer dillere genişleten kitaplıklardır.

Ortak Dil Altyapısı

Yönetilen iki Ortak Dil Altyapısı .NET uygulaması Pure Mpi.NET ve MPI.NET, Indiana Üniversitesi'nde BSD tarzı lisansla lisanslanan bir araştırma çalışmasıdır . Mono ile uyumludur ve altta yatan düşük gecikmeli MPI ağ yapılarından tam olarak yararlanabilir.

Java

Java'nın resmi bir MPI bağlaması olmamasına rağmen , birkaç grup farklı derecelerde başarı ve uyumluluk ile bu ikisini birleştirmeye çalışır. İlk denemelerden biri, Bryan Carpenter'ın mpiJava'sıydı, esasen yerel bir C MPI kitaplığına yönelik bir Java Yerel Arabirimi (JNI) sarmalayıcıları kümesiydi ve bu, aynı zamanda kullanılan belirli MPI kitaplığına karşı derlenmesi gereken sınırlı taşınabilirliğe sahip bir hibrit uygulamayla sonuçlandı. .

Bununla birlikte, bu orijinal proje aynı zamanda, sonraki diğer Java MPI projelerinin benimsediği mpiJava API'sini ( eşdeğer C++ bağlamalarını yakından takip eden Java için fiili bir MPI API'si) tanımladı . Daha az kullanılan bir API, daha nesne yönelimli ve Sun Microsystems'in kodlama kurallarına daha yakın olacak şekilde tasarlanmış olan MPJ API'dir . API'nin ötesinde, Java MPI kitaplıkları yerel bir MPI kitaplığına bağımlı olabilir veya Java'da mesaj iletme işlevlerini uygulayabilirken, P2P-MPI gibi bazıları da eşler arası işlevsellik sağlar ve karma platform çalışmasına izin verir.

Java / MPI en zorlu parçaların tür bazı açık olmaması gibi Java özelliklerinden kaynaklanan işaretçiler ve doğrusal bellek verimsiz çok boyutlu diziler ve karmaşık nesneleri transfer yapmak onun nesneler için adres alanı. Geçici çözümler genellikle bir seferde bir satırın aktarılmasını ve/veya hem gönderen hem de alan uçlarda açık serileştirme ve döküm gerçekleştirmeyi, tek boyutlu bir dizi kullanarak C veya Fortran benzeri dizileri simüle etmeyi ve ilkel türlere işaretçiler ile simüle etmeyi içerir. tek elemanlı dizilerin kullanımı, böylece Java konvansiyonlarından oldukça uzak programlama stilleri ile sonuçlanır.

Başka bir Java mesaj geçiş sistemi MPJ Express'tir. Son sürümler, küme ve çok çekirdekli yapılandırmalarda yürütülebilir. Küme yapılandırmasında, kümeler ve bulutlar üzerinde paralel Java uygulamalarını çalıştırabilir. Burada Java soketleri veya Myrinet gibi özel G/Ç ara bağlantıları MPJ Express süreçleri arasında mesajlaşmayı destekleyebilir. Ayrıca, yerel cihazını kullanarak MPI'nin yerel C uygulamasını da kullanabilir. Çok çekirdekli yapılandırmada, çok çekirdekli işlemcilerde paralel bir Java uygulaması yürütülür. Bu modda, MPJ Express işlemleri Java iş parçacıkları ile temsil edilir.

Julia

Julia MPI için dil sarıcı, kullanılan ve daha hızlı C ya da Fortran için daha etkili olduğu tespit edilmiştir.

MATLAB

MATLAB kullanarak MPI'nin birkaç akademik uygulaması vardır . MATLAB, MPI ve PVM kullanılarak uygulanan kendi paralel uzantı kitaplığına sahiptir .

OCaml

OCamlMPI Modülü, MPI işlevlerinin büyük bir alt kümesini uygular ve bilimsel hesaplamada aktif olarak kullanılır. 11.000 satırlık bir OCaml programı, modül kullanılarak, ilave 500 satır kod ve hafif bir yeniden yapılandırma ile "MPI ile birleştirildi" ve bir süper bilgisayarda 170 düğüme kadar mükemmel sonuçlarla çalıştı.

piton

Python'daki MPI uygulamaları şunları içerir: pyMPI , mpi4py, pypar, MYMPI ve ScientificPython'daki MPI alt modülü . pyMPI, değişken bir python yorumlayıcısı olduğu için dikkate değerdir; pypar, MYMPI ve ScientificPython'un modülü ise içe aktarma modülleridir. Çağrının nereye MPI_Initait olduğuna karar vermeyi kodlayıcının işi haline getirirler.

Yakın zamanda Boost C++ Kitaplıkları , MPI Python Bağlamalarını içeren Boost:MPI'yi satın aldı. Bu, C++ ve Python'u karıştırmak için özellikle yardımcıdır. Ekim 2016 Boost itibariyle: MPI'ın Python bağlantıları hala sabitlenmemiş ambalaj hatalar CentOS .

r

MPI'nin R bağlamaları, Rmpi ve pbdMPI'yi içerir ; burada Rmpi, yönetici-çalışan paralelliğine odaklanırken pbdMPI , SPMD paralelliğine odaklanır . Her iki uygulama da Open MPI veya MPICH2'yi tamamen destekler .

Örnek program

İşte bir "Merhaba, Dünya!" C ile yazılmış MPI programı . Bu örnekte, her işlemciye bir "merhaba" mesajı gönderiyoruz, önemsiz bir şekilde değiştiriyoruz, sonuçları ana işleme döndürüyoruz ve mesajları yazdırıyoruz.

/*
  "Hello World" MPI Test Program
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    char buf[256];
    int my_rank, num_procs;

    /* Initialize the infrastructure necessary for communication */
    MPI_Init(&argc, &argv);

    /* Identify this process */
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    /* Find out how many total processes are active */
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs);

    /* Until this point, all programs have been doing exactly the same.
       Here, we check the rank to distinguish the roles of the programs */
    if (my_rank == 0) {
        int other_rank;
        printf("We have %i processes.\n", num_procs);

        /* Send messages to all other processes */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            sprintf(buf, "Hello %i!", other_rank);
            MPI_Send(buf, sizeof(buf), MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD);
        }

        /* Receive messages from all other process */
        for (other_rank = 1; other_rank < num_procs; other_rank++)
        {
            MPI_Recv(buf, sizeof(buf), MPI_CHAR, other_rank,
                     0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            printf("%s\n", buf);
        }

    } else {

        /* Receive message from process #0 */
        MPI_Recv(buf, sizeof(buf), MPI_CHAR, 0,
                 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        assert(memcmp(buf, "Hello ", 6) == 0);

        /* Send message to process #0 */
        sprintf(buf, "Process %i reporting for duty.", my_rank);
        MPI_Send(buf, sizeof(buf), MPI_CHAR, 0,
                 0, MPI_COMM_WORLD);

    }

    /* Tear down the communication infrastructure */
    MPI_Finalize();
    return 0;
}

4 işlemle çalıştırıldığında aşağıdaki çıktıyı üretmelidir:

$ mpicc example.c && mpiexec -n 4 ./a.out
We have 4 processes.
Process 1 reporting for duty.
Process 2 reporting for duty.
Process 3 reporting for duty.

Burada, her biri çalışma zamanında programın bağımsız bir örneği olan ve atanan sıralar (yani sayısal kimlikler) 0, 1, 2 ve 3 mpiexecolan 4 işlemli örnek programı yürütmek için kullanılan bir komuttur mpiexec. MPI standardı, ancak bazı uygulamalar adı altında benzer bir komut sağlar mpirun. MPI_COMM_WORLDTüm süreçlerde oluşan iletişimci.

Tek bir program, çoklu veri ( SPMD ) programlama modeli bu şekilde kolaylaştırılır, ancak gerekli değildir; birçok MPI uygulaması, aynı MPI işinde birden çok, farklı yürütülebilir dosyanın başlatılmasına izin verir. Her sürecin kendi sıralaması, dünyadaki toplam süreç sayısı ve bunlar arasında noktadan noktaya (gönderme/alma) iletişim veya grup arasında toplu iletişim yoluyla iletişim kurma yeteneği vardır. MPI_COMM_WORLDAlgoritmaların ne yapacağına karar vermesine izin vermek için MPI'nin , kendi sıralaması ve dünyanın büyüklüğü ile SPMD tarzı bir program sağlaması yeterlidir . Daha gerçekçi durumlarda, G/Ç bu örnekte olduğundan daha dikkatli yönetilir. MPI, belirli bir sistemde standart G/Ç'nin (stdin, stdout, stderr) nasıl çalışması gerektiğini şart koşmaz. Genellikle rank-0 sürecinde beklendiği gibi çalışır ve bazı uygulamalar da diğer süreçlerin çıktısını yakalar ve huni haline getirir.

MPI, işlemci yerine süreç kavramını kullanır. Program kopyaları, işlemcilere MPI çalışma zamanı tarafından eşlenir . Bu anlamda, paralel makine bir fiziksel işlemciye veya N işlemciye eşlenebilir; burada N , kullanılabilir işlemcilerin sayısı veya hatta aradaki bir şeydir. Maksimum paralel hızlanma için daha fazla fiziksel işlemci kullanılır. Bu örnek, davranışını N dünyasının boyutuna göre ayarlar , bu nedenle, çalışma zamanı kararları mevcut mutlak eşzamanlılık miktarına bağlı olarak değişebilse de, her boyut varyasyonu için derleme olmadan çalışma zamanı yapılandırmasına ölçeklendirmeyi de amaçlar.

MPI-2'nin benimsenmesi

MPI-1.2'nin benimsenmesi, özellikle küme hesaplamada evrensel olmuştur, ancak MPI-2.1'in kabulü daha sınırlı olmuştur. Sorunlar şunları içerir:

  1. MPI-2 uygulamaları, G/Ç ve dinamik süreç yönetimini içerir ve ara yazılımın boyutu önemli ölçüde daha büyüktür. Toplu planlama sistemlerini kullanan çoğu site, dinamik süreç yönetimini destekleyemez. MPI-2'nin paralel G/Ç'si iyi kabul edilir.
  2. MPI-2'den önce birçok MPI-1.2 programı geliştirildi. Taşınabilirlik endişeleri başlangıçta benimsemeyi yavaşlattı, ancak daha geniş destek bunu azalttı.
  3. Birçok MPI-1.2 uygulaması, MPI-2 işlevselliğine gerçek bir ihtiyaç duymadan bu standardın (16-25 işlev) yalnızca bir alt kümesini kullanır.

Gelecek

MPI'nin geleceğinin bazı yönleri sağlam görünüyor; diğerleri daha az. MPI Forum bazı MPI-2 konuların açıklığa kavuşturulması ve olası bir MPI-3, sürümleri sonuçlandı için gelişmeleri keşfetmek için 2007'de yeniden toplandı MPI 3.0 (Eylül 2012) ve MPI 3.1 (Haziran 2015).

Mimariler, daha yüksek dahili eşzamanlılık ( çok çekirdekli ), daha iyi ince taneli eşzamanlılık denetimi (iş parçacığı oluşturma, yakınlık) ve daha fazla bellek hiyerarşisi düzeyiyle değişiyor . Çok iş parçacıklı programlar, bu gelişmelerden tek iş parçacıklı uygulamalara göre daha kolay yararlanabilir. Bu, simetrik çoklu işlem için ayrı, tamamlayıcı standartlar , yani OpenMP sağlamıştır . MPI-2, standartlara uygun uygulamaların çok iş parçacıklı sorunlarla nasıl başa çıkması gerektiğini tanımlar, ancak uygulamaların çok iş parçacıklı ve hatta iş parçacığı güvenli olmasını gerektirmez. MPI-3, bir düğüm içinde paylaşılan bellek paralelliğini kullanma yeteneğini ekler. Adaptive MPI, Hybrid MPI, Fine-Grained MPI, MPC ve diğerleri gibi MPI uygulamaları, MPI'deki farklı zorlukları ele alan MPI standardının uzantılarını sunar.

Astrofizikçi Jonathan Dursi, Chapel dili, Birleşik Paralel C , Hadoop , Spark ve Flink gibi daha yeni teknolojilere işaret ederek MPI'nin eskidiğini söyleyen bir fikir yazısı yazdı .

Ayrıca bakınız

Referanslar

daha fazla okuma

Dış bağlantılar