Programmēšana

Kāpēc efektīvai paralēlajai programmēšanai jāietver mērogojama atmiņas piešķiršana

Daudzkodolu procesors? Jā.

Rakstīt programmu, lai tā darbotos paralēli? Jā.

Vai atcerējāties izmantot mērogojamu atmiņas sadalītāju? Nē? Tad lasiet tālāk ...

Pēc manas pieredzes, lai pārliecinātos, vai programma “atmiņas piešķiršana” ir gatava paralēlismam, bieži tiek ignorēts elements, lai paralēlā programma darbotos labi. Es jums varu parādīt neticami vienkāršu veidu, kā pārliecināties, vai tā ir problēma sastādītai programmai (C, C ++, Fortran utt.), Kā arī to, kā to novērst.

Jebkuras paralēlas programmas kritiskā daļa ir mērogojama atmiņas piešķiršana, kas ietver programmas izmantošanujaunskā arī nepārprotami zvani uzmalloc, calloc vai realloc. Iespējas ietver TBBmalloc (Intel Threading Building Blocks), jemalloc un tcmalloc. TBBmalloc ir jauna “starpniekservera” funkcija, kas ļauj viegli izmēģināt jebkuru kompilētu programmu mazāk nekā 5 minūtēs.

Veiktspējas ieguvumi, izmantojot mērogojamu atmiņas sadalītāju, ir ievērojami. TBBmalloc bija viens no pirmajiem plaši izmantotajiem pielāgojamās atmiņas sadalītājiem, ne mazākā mērā tāpēc, ka tas bija bez TBB, lai palīdzētu uzsvērt, cik svarīgi ir iekļaut atmiņas piešķiršanas apsvērumus jebkurā paralēlā programmā. Tas joprojām ir ārkārtīgi populārs šodien un joprojām ir viens no labākajiem pieejamo mērogojamās atmiņas sadalītājiem.

Vienkāršs risinājums bez koda izmaiņām

Izmantojot starpniekservera metodes, mēs varam aizstāt visā pasaulē jauns/dzēst un malloc/calloc/realloc/bez maksas/ utt. rutīnas ar dinamiskas atmiņas saskarnes nomaiņas tehniku. Šis automātiskais veids, kā aizstāt noklusējuma funkcijas dinamiskās atmiņas piešķiršanai, neapšaubāmi ir vispopulārākais TBBmalloc izmantošanas veids. Tas ir viegli un pietiekami lielākajai daļai programmu.

Katrā operētājsistēmā izmantotā mehānisma detaļas nedaudz atšķiras, taču neto efekts visur ir vienāds.

Mēs sākam mūsu 5 minūšu izmēģinājumu, lejupielādējot un instalējot Threading Building Blocks (bez //threadingbuildingblocks.org; tas ir iekļauts arī Intel Parallel Studio produktu sastāvā).

Izmantojiet starpniekserveri operētājsistēmā Linux

Operētājsistēmā Linux mēs varam veikt nomaiņu, ielādējot starpniekservera bibliotēku programmas ielādes laikā, izmantojot LD_PRELOAD vides mainīgais (nemainot izpildāmo failu) vai saistot galveno izpildāmo failu ar starpniekservera bibliotēku (-ltbbmalloc_proxy). Linux programmas iekrāvējam programmas ielādes laikā jāspēj atrast starpniekserveri un pielāgojamās atmiņas sadalītāja bibliotēku. Šim nolūkam mēs varam iekļaut direktoriju, kurā ir bibliotēkas LD_LIBRARY_PATH vides mainīgo vai pievienojiet to /etc/ld.so.conf.

Izmēģiniet šādi:

laiks ./a.out (vai kā mūsu programmu sauc)

eksportēt LD_PRELOAD = libtbbmalloc_proxy.so.2

laiks ./a.out (vai kā mūsu programmu sauc)

MacOS izmantojiet starpniekserveri

MacOS mēs varam veikt nomaiņu vai nu, ielādējot starpniekservera bibliotēku programmas ielādes laikā, izmantojot DYLD_INSERT_LIBRARIES vides mainīgais (nemainot izpildāmo failu) vai saistot galveno izpildāmo failu ar starpniekservera bibliotēku (-ltbbmalloc_proxy). MacOS programmas iekrāvējam jāspēj atrast starpniekserveri un pielāgojamās atmiņas sadalītāja bibliotēku programmas ielādes laikā. Šim nolūkam mēs varam iekļaut direktoriju, kurā ir bibliotēkas DYLD_LIBRARY_PATH vides mainīgais.

Izmēģiniet šādi:

laiks ./a.out (vai kā mūsu programmu sauc)

eksportēt DYLD_INSERT_LIBRARIES = $ TBBROOT / lib / libtbbmalloc_proxy.dylib

laiks ./a.out (vai kā mūsu programmu sauc)

Izmantojiet starpniekserveri sistēmā Windows

Operētājsistēmā Windows mums ir jāpārveido izpildāmā versija. Mēs varam vai nu piespiest ielādēt starpniekservera bibliotēku, pievienojot #include "tbb / tbbmalloc_proxy.h" mūsu avota kodā vai izmantojot noteiktas saistītāja iespējas, veidojot izpildāmo failu:

Par Win32:

            tbbmalloc_proxy.lib / IETver: "___ TBB_malloc_proxy"

Win64:

            tbbmalloc_proxy.lib / INCLUDE: "__ TBB_malloc_proxy"

Windows programmas iekrāvējam programmas ielādes laikā jāspēj atrast starpniekserveri un pielāgojamās atmiņas sadalītāja bibliotēku. Šim nolūkam mēs varam iekļaut direktoriju, kurā ir bibliotēkas CELS vides mainīgais. Izmēģiniet to, izmantojot programmu Visual Studio “Performance Profiler”, lai programmētu programmu ar iekļaušanas vai saites opciju un bez tās.

Pārbaudiet mūsu starpniekservera bibliotēkas lietošanu ar nelielu programmu

Es iesaku izmēģināt savu programmu, kā aprakstīts iepriekš. Palaist ar starpniekserveri un bez tā, un redzēt, cik lielu labumu gūst jūsu lietojumprogramma. Lietojumprogrammās ar lielu paralēlismu un lielu atmiņas sadalījumu bieži tiek novēroti 10-20% palielinājumi (es arī vienu reizi esmu redzējis 400% pieaugumu), savukārt programmas ar nelielu paralēlismu vai nelielu sadalījumu var neredzēt vispār. Ātrie testi, kas iepriekš aprakstīti, izmantojot starpniekservera bibliotēku, parādīs, kurā kategorijā ir jūsu lietojumprogramma.

Esmu arī uzrakstījis īsu programmu, lai ilustrētu efektus, kā arī nodrošinātu ērtu veidu, kā pārbaudīt, vai lietas ir instalētas un darbojas, kā paredzēts. Mēs varam izmēģināt starpniekservera bibliotēku ar vienkāršu programmu:

# iekļaut

#include "tbb / tbb.h"

izmantojot nosaukumvietas tbb;

const int N = 1000000;

int main () {

dubultā * a [N];

parallel_for (0, N-1, [&] (int i) {a [i] = jauns dubultnieks;});

parallel_for (0, N-1, [&] (int i) {dzēst a [i];});

atgriešanās 0;

}

Mana piemēru programma izmanto daudz vietas kaudzē, tāpēc “ulimit –s neierobežots”(Linux / macOS) vai“/ KAudzīte: 10000000”(Visual Studio: Properties> Configuration Properties> Linker> System> Stack Reserve Size) būs svarīgi, lai izvairītos no tūlītējām avārijām.

Pēc apkopošanas šeit ir minēti dažādi veidi, kā es palaidu savu mazo programmu, lai redzētu ātrumu ar starpniekservera bibliotēku un bez tās.

Skriešana un laiks tbb_mem.cpp uz quadcore virtuāls Linux mašīna, es redzēju sekojošo:

% laiks ./tbb_mem

reāls 0m0.160s

lietotājs 0m0.072s

sys 0m0.048s

%

% exportLD_PRELOAD = $ TBBROOT / lib / libtbbmalloc_proxy.dylib

%

% laiks ./tbb_mem

reāls 0m0.043s

lietotājs 0m0.048s

sys 0m0.028s

Darbojoties un plānojot tbb_mem.cpp četrkodolu iMac (macOS), es redzēju:

% laiks ./tbb_mem

reāls 0m0.046s

lietotājs 0m0,078s

sys 0m0.053s

%

% eksportēt DYLD_INSERT_LIBRARIES = $ TBBROOT / lib / libtbbmalloc_proxy.dylib

%

% laika ./tbb_mem

reāls 0m0.019s

lietotājs 0m0.032s

sys 0m0.009s

Operētājsistēmā Windows, izmantojot Visual Studio “Performance Profiler” četrkodolu Intel NUC (Core i7), es redzēju 94 ms reizes bez mērogojamā atmiņas profilētāja un 50 ms ar to (pievienojot #include "tbb / tbbmalloc_proxy.h"programmā).

Kompilācijas apsvērumi

Personīgi man nav bijis problēmu ar kompilatoriem, kas veic “malloc optimizācijas”, bet tehniski es ieteiktu, ka, sastādot ar programmām, šādas kompilatora “malloc optimizācijas” būtu jāatspējo. Varētu būt prātīgi pārbaudīt iecienītā kompilatora kompilatora dokumentāciju. Piemēram, izmantojot Intel kompilatorus vai gcc, vislabāk ir norādīt šādus karodziņus:

-fno-builtin-malloc (operētājsistēmā Windows: / Qfno-builtin-malloc)

-fno-builtin-calloc (operētājsistēmā Windows: / Qfno-builtin-calloc)

-fno-builtin-realloc (operētājsistēmā Windows: / Qfno-builtin-realloc)

-fno-builtin-free (operētājsistēmā Windows: / Qfno-builtin-free)

Šo karodziņu neizmantošana var neradīt problēmas, taču nav slikta ideja būt drošam.

Kopsavilkums

Mērogojamā atmiņas sadalītāja izmantošana ir būtisks elements jebkurā paralēlajā programmā. Esmu parādījis, ka TBBmalloc var viegli injicēt, neprasot koda izmaiņas (lai gan mans “Windows” risinājums ir “iekļaut”. Jūs, iespējams, redzēsiet jauku paātrinājumu, veicot tikai 5 minūtes ilgu darbu, un to var viegli pielietot vairākām lietojumprogrammām. Operētājsistēmās Linux un macOS jūs pat varat paātrināt programmas bez avota koda!

Noklikšķiniet šeit, lai lejupielādētu bezmaksas Intel Parallel Studio XE 30 dienu izmēģinājumu.

$config[zx-auto] not found$config[zx-overlay] not found