OpenHMPP - OpenHMPP

OpenHMPP (HMPP[1] Hibrit Çok Çekirdekli Paralel Programlama için) - için programlama standardı heterojen hesaplama. Bir dizi derleyici direktifine dayanan standart, işlemek için tasarlanmış bir programlama modelidir. donanım hızlandırıcıları ile ilişkili karmaşıklık olmadan GPU programlama. Direktiflere dayalı bu yaklaşım, bir uygulama kodu ile bir donanım hızlandırıcı (HWA) kullanımı arasında gevşek bir ilişki sağladıkları için uygulanmıştır.

Giriş

OpenHMPP direktif tabanlı programlama modeli, donanım hızlandırıcılarındaki hesaplamaları boşaltmak ve donanım belleğine / bellekten veri hareketini optimize etmek için bir sözdizimi sunar.

Model, tarafından başlatılan çalışmalara dayanmaktadır. CAPS (Gömülü ve Süper Ölçekli İşlemciler için Derleyici ve Mimari) ortak bir proje INRIA, CNRS, Rennes Üniversitesi 1 ve INSA of Rennes.

OpenHMPP kavramı

OpenHMPP, HWA'lar üzerinde uzaktan yürütülebilen işlevler olan kodelet kavramına dayanmaktadır.

OpenHMPP kod hücresi konsepti

Bir kod hücresi aşağıdaki özelliklere sahiptir:

  1. Bu bir saf fonksiyon.
    • İçermez statik veya uçucu değişken bildirimleri veya bir HMPP yönergesi "yerleşik" tarafından bildirilmişler dışında herhangi bir genel değişkene atıfta bulunmayın
    • Görünmez gövdeli (satır içine alınamayan) herhangi bir işlev çağrısı içermez. Bu, kitaplıkların ve malloc, printf, ... gibi sistem işlevlerinin kullanımını içerir.
    • Her işlev çağrısı, statik bir saf işleve başvurmalıdır (işlev işaretçisi yok).
  2. Herhangi bir değer döndürmez (void işlevi C veya içindeki bir alt program Fortran ).
  3. Argümanların sayısı sabitlenmelidir (yani bir değişken işlev de olduğu gibi stdarg.h C).
  4. Özyinelemeli değildir.
  5. Parametrelerinin örtüşmemiş olduğu varsayılır (bkz. Takma ad (bilgi işlem) ve İşaretçi takma adı ).
  6. Çağrı sitesi yönergelerini (yani başka bir kod hücresine RPC) veya diğer HMPP yönergelerini içermez.

Bu özellikler bir kod hücresinin RPC bir HWA tarafından uzaktan yürütülebilir. Bu RPC ve ilişkili veri aktarımları zaman uyumsuz olabilir.

Codelet RPC'leri

HMPP, senkronize ve asenkron RPC sağlar. Zaman uyumsuz işlemin uygulanması donanıma bağlıdır.

Eşzamanlı ve eşzamansız RPC

HMPP Bellek Modeli

HMPP iki adres alanını dikkate alır: ana işlemci bir ve HWA belleği.

HMPPP bellek Modeli

Yönergeler kavramı

OpenHMPP direktifleri, uygulama kaynak koduna eklenen “meta bilgiler” olarak görülebilir. Güvenli meta bilgilerdir, yani orijinal kod davranışını değiştirmezler. HWA belleğine / belleğinden veri aktarımlarının yanı sıra bir işlevin uzaktan yürütülmesini (RPC) ele alırlar.

Aşağıdaki tablo OpenHMPP direktiflerini tanıtmaktadır. OpenHMPP direktifleri farklı ihtiyaçlara hitap eder: bazıları bildirimlere, diğerleri ise uygulamanın yönetimine adanmıştır.

Kontrol akışı talimatlarıVeri yönetimi yönergeleri
Beyannamelercodelet
grup
yerleşik
harita
mapbyname
Operasyonel Direktiflerçağrı sitesi
senkronize etmek
bölge
tahsis etmek
serbest bırakmak
Advancedload
yetki verilmiş mağaza

Direktif seti kavramı

HMPP yaklaşımının temel noktalarından biri, bir uygulamada yayılan bir dizi direktif üzerinde tutarlı bir yapıyı ortaya çıkarmayı mümkün kılan direktifler kavramı ve bunlarla ilgili etiketlerdir.

İki tür etiket vardır:

  • Bir kod hücresiyle ilişkilendirilmiş. Genel olarak, bu tür etiketleri taşıyan direktifler, yalnızca bir kod hücresinin yönetimi ile sınırlıdır (belgenin geri kalanında kodbeleri grubundan ayırmak için tek başına kod hücresi olarak adlandırılır).
  • Bir kod hücresi grubuyla ilişkilendirilmiş. Bu etiketler şu şekilde not edilir: "", burada "LabelOfGroup" kullanıcı tarafından belirtilen bir addır. Genel olarak, bu tür bir etiketi olan direktifler tüm grupla ilgilidir. Grup kavramı, performans elde etmek için uygulama boyunca verilerin belirli bir yönetimini gerektiren bir sorun sınıfına ayrılmıştır.

OpenHMPP Direktifleri Sözdizimi

Gösterimleri basitleştirmek için, düzenli ifadeler HMPP direktiflerinin sözdizimini tanımlamak için kullanılacaktır.

Aşağıdaki renk kuralı, söz dizimi direktiflerinin açıklaması için kullanılır:

  • Ayrılmış HMPP anahtar kelimeleri yeşil;
  • HMPP anahtar kelimelerinde reddedilebilecek gramer unsurları kırmızı;
  • Kullanıcı değişkenleri siyah renkte kalır.

Genel sözdizimi

OpenHMPP direktiflerinin genel sözdizimi şöyledir:

  • C dili için:
#pragma hmpp <grp_label> [codelet_label]? yönerge_türü [,directive_parameters]* [&]
  • FORTRAN dili için:
! $ hmpp <grp_label> [codelet_label]? yönerge_türü [,directive_parameters]* [&]

Nerede:

  • <grp_label>: bir grup kod hücresini adlandıran benzersiz bir tanımlayıcıdır. Uygulamada hiçbir grubun tanımlanmadığı durumlarda bu etiket kolayca gözden kaçabilir. Yasal etiket adı şu dilbilgisine uygun olmalıdır: [a-z, A-Z, _] [a-z, A-Z, 0-9, _] *. "<>" Karakterlerinin sözdizimine ait olduğunu ve bu tür bir etiket için zorunlu olduğunu unutmayın.
  • codelet_label: bir kod hücresini adlandıran benzersiz bir tanımlayıcıdır. Yasal etiket adı şu dilbilgisine uygun olmalıdır: [a-z, A-Z, _] [a-z, A-Z, 0-9, _] *
  • direktif: direktifin adıdır;
  • directive_parameters: yönerge ile ilişkili bazı parametreleri belirtir. Bu parametreler farklı türlerde olabilir ve yönergeye verilen bazı argümanları ya bir yürütme modunu (örneğin eşzamansız ve eşzamanlı) belirtir;
  • [&]: bir sonraki satırda yönergeye devam etmek için kullanılan bir karakterdir (C ve FORTRAN için aynıdır).

Yönerge parametreleri

Bir direktifle ilişkili parametreler farklı tiplerde olabilir. OpenHMPP'de tanımlanan yönerge parametreleri aşağıdadır:

  • version = major.minor [.micro]: Önişlemci tarafından dikkate alınacak HMPP direktiflerinin sürümünü belirtir.
  • değiştirgeler [arg_items] .size = {dimsize [, dimsize] *}: skaler olmayan bir parametrenin (bir dizi) boyutunu belirtir.
  • bağımsız değişkenler [arg_items] .io = [giriş | çıkış | çıkış]: belirtilen işlev bağımsız değişkenlerinin girdi, çıktı veya her ikisi olduğunu gösterir. Varsayılan olarak, nitelenmemiş argümanlar girdilerdir.
  • koşul = "ifade": grubun veya kod hücrelerinin yürütülmesini başlatmak için doğru olması gereken bir mantıksal C veya Fortran ifadesi olarak bir yürütme koşulunu belirtir.
  • target = target_name [: target_name] *: verilen sırada hangi hedeflerin kullanılmaya çalışılacağını belirtir.
  • asenkron: kod hücresi yürütmesinin engellemediğini belirtir (varsayılan eşzamanlıdır).
  • args [] .advancedload = true: belirtilen parametrelerin önceden yüklendiğini gösterir. Yalnızca giriş veya çıkış parametreleri önceden yüklenebilir.
  • args [arg_items] .noupdate = true: bu özellik, verilerin HWA'da zaten mevcut olduğunu ve böylece hiçbir aktarıma gerek olmadığını belirtir. Bu özellik ayarlandığında, dikkate alınan argüman üzerinde transfer yapılmaz.
  • args [] .addr = "": <expr> yüklenecek verinin adresini veren bir ifadedir.
  • args [] .const = true: bağımsız değişkenin yalnızca bir kez yükleneceğini belirtir.

OpenHMPP yönergeleri

Bir kod hücresi bildirmek ve yürütmek için yönergeler

Bir codelet yönergesi, bir donanım hızlandırıcı üzerinde uzaktan yürütülecek bir hesaplama bildirir. codelet direktif:

  • Codelet etiketi zorunludur ve uygulamada benzersiz olmalıdır
  • Grup tanımlanmamışsa grup etiketi gerekli değildir.
  • Codelet yönergesi, işlev bildiriminden hemen önce eklenir.

Direktifin sözdizimi şöyledir:

#pragma hmpp <grp_label> codelet_label codelet                             [, sürüm = major.minor [.micro]?]? [, args [arg_items] .io =[[içinde|dışarı|giriş]]*                            [, args [arg_items] .size = {karartma [, karartma] *}]*                            [, args [arg_items] .const = true]*                            [, koşul = "ifade"] [, hedef =target_name[:target_name]*]

Farklı kullanımları veya farklı yürütme bağlamlarını belirtmek için bir işleve birden fazla codelet yönergesi eklenebilir. Bununla birlikte, belirli bir arama sitesi etiketi için yalnızca bir kod hücresi yönergesi olabilir.

çağrı sitesi yönerge, programın belirli bir noktasında bir kod hücresinin nasıl kullanılacağını belirtir.

Direktifin sözdizimi şöyledir:

#pragma hmpp <grp_label> codelet_label çağrı sitesi                     [, asenkron]?                     [, args [arg_items] .size = {karartma [, karartma] *}]*                     [, args [arg_items] .advancedload =[[doğru|yanlış]]*                     [, args [arg_items] .addr = "ifade"]*                     [, args [arg_items] .noupdate = true]*

Burada bir örnek gösterilmektedir:

 / * codelet beyanı * / #pragma hmpp simple1 codelet, args [outv] .io = inout, target = CUDA statik geçersiz Matvec(int sn, int sm, yüzer inv[sm], yüzer inm[sn][sm], yüzer *outv){     int ben, j;     için (ben = 0 ; ben < sm ; ben++) {       yüzer temp = outv[ben];       için (j = 0 ; j < sn ; j++) {         temp += inv[j] * inm[ben][ j];     }    outv[ben] = temp;  }    int ana(int argc, kömür **argv) {    int n;    ........    / * kod hücresi kullanımı * /  #pragma hmpp simple1 çağrı sitesi, args [outv] .size = {n}  Matvec(n, m, Myinc, inm, myoutv);    ........  }

Bazı durumlarda, uygulama boyunca belirli bir veri yönetimi gerekir (CPU / GPU veri hareketleri optimizasyonu, paylaşılan değişkenler ...).

grup yönerge, bir grup kod hücresinin bildirimine izin verir. Bu direktifte tanımlanan parametreler, gruba ait tüm kodeletlere uygulanır. Direktifin sözdizimi şöyledir:

#pragma hmpp <grp_label> grup                           [, version = .  [. ]?]? [, hedef = target_name[:target_name]*]]?                           [, koşul = “ifade]?

İletişim ek yükünü optimize etmek için veri aktarımı yönergeleri

Bir HWA kullanırken, ana darboğaz genellikle HWA ile ana işlemci arasındaki veri aktarımlarıdır.
İletişim ek yükünü sınırlamak için, veri aktarımları HWA'nın eşzamansız özelliği kullanılarak aynı kod hücresinin ardışık yürütmeleriyle örtüşebilir.

  • tahsis yönergesi

tahsis etmek yönerge HWA'yı kilitler ve gerekli bellek miktarını tahsis eder.

#pragma hmpp <grp_label> tahsis etmek [, args [arg_items] .size = {karartma [, karartma] *}]*
  • yayın direktifi

serbest bırakmak yönerge, bir grup veya bağımsız bir kod hücresi için HWA'nın ne zaman serbest bırakılacağını belirtir.

#pragma hmpp <grp_label> yayın
  • advancedload direktifi

Advancedload yönerge, kod hücresinin uzaktan yürütülmesinden önce verileri önceden getirir.

#pragma hmpp <grp_label> [codelet_label]? Advancedload                  , args [arg_items]                  [, args [arg_items] .size = {karartma [, karartma] *}]*                  [, args [arg_items] .addr = "ifade"]*                  [, args [arg_items] .section = {[subscript_triplet,]+}]*                  [, asenkron]
  • delegatedstore yönergesi

yetki verilmiş mağaza yönergesi, eşzamansız bir kod hücresi yürütmesinin tamamlanmasını beklemek ve ardından sonuçları indirmek için bir eşitleme engelidir.

#pragma hmpp <grp_label> [codelet_label]? yetki verilmiş mağaza                 , args [arg_items]                [, args [arg_items] .addr = "ifade"]*                [, args [arg_items] .section = {[subscript_triplet,]+}]*
  • Eşzamansız Hesaplamalar

senkronize etmek yönergesi, zaman uyumsuz bir çağrı sitesi yürütmesinin tamamlanmasına kadar beklemeyi belirtir. Senkronize etme yönergesi için kod hücresi etiketi her zaman zorunludur ve kod hücresi bir gruba aitse grup etiketi gereklidir.

#pragma hmpp <grp_label> codelet_label senkronize etmek
  • Misal

Aşağıdaki örnekte, cihaz başlatma, bellek tahsisi ve giriş verilerinin yüklenmesi, döngünün her yinelemesinde değil, yalnızca bir kez döngü dışında yapılır.

senkronize etmek yönergesi, başka bir yinelemeyi başlatmadan önce kod hücresinin eşzamansız yürütülmesinin tamamlanmasını beklemeye izin verir. Sonunda yetki verilmiş mağaza Döngünün dışındaki yönerge sgemm sonucunu yükler.

 int ana(int argc, kömür **argv) {  #pragma hmpp sgemm ayırma, args [vin1; vin2; vout] .size = {size, size} #pragma hmpp sgemm advancedload, args [vin1; vin2; vout], args [m, n, k, alpha, beta]    için ( j = 0 ; j < 2 ; j ++) {    #pragma hmpp sgemm çağrı sitesi, zaman uyumsuz, args [vin1; vin2; vout] .advancedload = true, args [m, n, k, alpha, beta] .advancedload = true    sgemm (boyut, boyut, boyut, alfa, vin1, vin2, beta, vout);    #pragma hmpp sgemm senkronizasyonu }  #pragma hmpp sgemm delegatedstore, args [vout] #pragma hmpp sgemm sürümü

Kod hücreleri arasında veri paylaşımı

Bu yönergeler, tüm grup için verilen adı paylaşan tüm argümanları birlikte eşler.

Eşlenen tüm bağımsız değişkenlerin türleri ve boyutları aynı olmalıdır.

harita yönerge, aygıt üzerindeki çeşitli argümanları eşler.

#pragma hmpp <grp_label> harita, args [arg_items]

Bu yönerge ile oldukça benzerdir. harita yönerge, haritalanacak bağımsız değişkenlerin doğrudan adlarıyla belirtilmesi dışında. mapbyname yönerge çoklu ile eşdeğerdir harita direktifler.

#pragma hmpp <grp_label> mapbyname [,değişkenAdı] +

Küresel değişken

yerleşik yönergesi, bir grup içinde bazı değişkenleri genel olarak bildirir. Bu değişkenlere daha sonra gruba ait herhangi bir kod hücresinden doğrudan erişilebilir. Bu yönerge, kaynak kodda hemen ardından gelen bildirim deyimi için geçerlidir.

Bu direktifin sözdizimi şöyledir:

#pragma hmpp <grp_label> ikamet eden                [, bağımsız değişkenler [::var_name] .io =[[içinde|dışarı|giriş]]*               [, bağımsız değişkenler [::var_name] .size = {karartma [, karartma] *}]*               [, bağımsız değişkenler [::var_name] .addr = "ifade"]*               [, bağımsız değişkenler [::var_name] .const = true]*

Gösterim :: var_name ön ek ile ::, yerleşik olarak bildirilen bir uygulamanın değişkenini gösterir.

Bölgelerin hızlanması

Bölge, codelet / çağrı sitesi yönergelerinin bir birleşimidir. Amaç, kod hücresini oluşturmak için kodun yeniden yapılandırılmasından kaçınmaktır. Bu nedenle, mevcut tüm özellikler codelet veya çağrı sitesi direktifler kullanılabilir bölgeler direktifler.

C dilinde:

#pragma hmpp [<Grubum>] [etiket] bölge                                    [, args [arg_items] .io =[[içinde|dışarı|giriş]]*                           [, koşul = "ifade"]<                           [, args [arg_items] .const = true]*                           [, hedef =target_name[:target_name]*]                           [, args [arg_items] .size = {karartmak [,karartma] *}]*                           [, args [arg_items] .advancedload =[[doğru|yanlış]]*                           [, args [arg_items] .addr = "ifade"]*                           [, args [arg_items] .noupdate = true]*                           [, asenkron]?                           [, özel = [arg_items]] * {C BLOK BİLDİRİMLERİ}

Uygulamalar

OpenHMPP Açık Standardı, HMPP Sürüm 2.3'e (Mayıs 2009, CAPS kuruluşu) dayanmaktadır.

OpenHMPP direktifine dayalı programlama modeli şurada uygulanır:

  • CAPS Derleyicileri, hibrit bilgi işlem için CAPS Entreprise derleyicileri
  • PathScale ENZO Compiler Suite (NVIDIA GPU'ları destekler)

OpenHMPP, HPC aktörler[DSÖ? ] Petrol ve Gaz sektöründe,[kaynak belirtilmeli ] Enerji,[kaynak belirtilmeli ] İmalat,[kaynak belirtilmeli ] Finans,[kaynak belirtilmeli ] Eğitim ve Araştırma.[kaynak belirtilmeli ]

Ayrıca bakınız

Referanslar

  1. ^ Dolbeau, Romain; Bihan, Stéphane; Bodin, François (4 Ekim 2007). HMPP: Hibrit Çok Çekirdekli Paralel Programlama Ortamı (PDF). Grafik İşleme Birimlerinde Genel Amaçlı İşleme Çalıştayı. Arşivlenen orijinal (PDF) 16 Ocak 2014. Alındı 14 Ocak 2014.

Dış bağlantılar