You are on page 1of 26

# SVEUILITE U ZAGREBU

## Viedretvena paralelizacija evolucijskih

algoritama
Branimir Gregov
Mentor: Prof. dr. sc. Domagoj Jakobovi

## Zagreb, lipanj 2013.

1. Uvod ................................................................................................ 1
2. ECF ................................................................................................. 2
3. OpenMP .......................................................................................... 4
3.1. Kratka povijest OpenMP-a ........................................................ 4
3.2. to je uope OpenMP ............................................................... 4
3.3 Osnovne pretprocesorske naredbe standarda OpenMP ............ 6
3.3.1. Naredba PARALLEL ........................................................... 6
3.3.2. Naredba SINGLE................................................................ 7
3.3.3. Naredba FOR ..................................................................... 7
3.3.4. Naredba CRITICAL ............................................................ 7
4. Paralelizirani algoritmi...................................................................... 8
4.1. Differential Evolution ................................................................. 9
4.2. Elimination ................................................................................ 9
4.3. Genetic Annealing ................................................................... 11
4.4. Hooke-Jeeves ......................................................................... 14
4.5. Particle Swarm Optimization ................................................... 15
4.6. Roulette Wheel........................................................................ 16
4.7. Steady State Tournament ....................................................... 19

5. Zakljuak ....................................................................................... 20
6. Literatura ....................................................................................... 21
7. Saetak.......................................................................................... 22

1. Uvod
Tema ovog zavrnog rada je viedretvena paralelizacija evolucijskih
algoritama iz okruenja Evolutionary Computational Framework (ECF) uporabom
tehnologije OpenMP (Open Multi-Processing).
OpenMP se koristi za jednostavnu paralelizaciju programa na raunalima
sa dijeljenim memorijskim prostorom.
Evolucijsko raunanje (engl. evolutionary computation) je grana umjetne
inteligencije koja vue inspiraciju iz prirode. Ono je rezultat ljudskog promatranja
procesa u prirodi te pokuaja oponaanja tih procesa u svrhu rjeavanja odreenih
optimizacijskih problema, tj. problema koji zahtijevaju pronalazak to boljeg (ne
nuno i najboljeg) rjeenja, pritom se koristei metodama stohastike optimizacije
te raznim metaheuristikama.
Evolucijski algoritam je grana evolucijskog raunanja. On obuhvaa niz
koraka koji oponaaju bioloku evoluciju, tj. razvoj odreene populacije (populacija
je skup jedinki od kojih svaka pojedina jedinka predstavlja jedno mogue rjeenje
zadanog problema zapisano na kompaktni i raunalu shvatljivi nain) kroz neki
broj iteracija, tj. generacija. Razvoj pojedine generacije koristi mehanizme koje
moemo pronai u prirodi, kao to su razmnoavanje, prirodna selekcija, mutacija,
opstanak najjaih, i sl.

2. ECF
Evolutionary Computational Framework (ECF) je radno okruenje napisano
u programskom jeziku C++ koje se koristi za evolucijsko raunanje. Napisan je sa
namjerom da se omogui to lake dodavanje novih algoritama te raznih
operatora (krianja, mutacije, selekcije i sl.) kao i jednostavnu konfiguraciju
parametara potrebnih za rad pojedinog algoritma. Pod konfiguracijom parametara
se misli na zadavanje vrijednosti poput veliine populacije, maksimalnog broja
generacija, vjerojatnosti krianja i mutacije, broj subpopulacija, uestalost
migracije meu subpopulacijama i mnoge druge.

## Slika 2.1. UML dijagram razreda unutar ECF-a

3. OpenMP
3.1. Kratka povijest OpenMP-a
Ranih devedesetih godina pojavila se potreba za paralelizacijom programa
pisanih u programskom jeziku Fortran koji su se izvravali na sustavima sa
dijeljenom memorijom. Ideja je bila napraviti neto jednostavno za koritenje to bi
automatski paraleliziralo petlje, tj. raspodijelilo posao koji se mogao izvravati
paralelno na vie procesorskih jezgri istovremeno. Nastale su mnoge razne
implementacije u obliku ekstenzija za Fortran te se nedugo nakon toga, sasvim
prirodno, pojavila potreba za standardizacijom. Prvi pokuaj standardizacije je
standard ANSI X3H5 iz 1994. godine koji meutim nije dobro primljen u
programerskoj zajednici jer se u to vrijeme poelo obraati vie panje na sustave
sa raspodijeljenom memorijom koji su tada postajali popularni.
Tri godine kasnije je zapoeo rad na standardu OpenMP koji je preuzeo
stari ANSI X3H5 standard.
3.2. to je uope OpenMP
OpenMP

je

suelje

za

programiranje

aplikacija

(engl.

Application

## Programming Interface) koje se koristi za pisanje aplikacija koje dio programa (a

moe i cijeli) izvravaju paralelno. OpenMP podrava viedretveni paralelizam
iskljuivo na sustavima sa dijeljenom memorijom. Sustav moe imati jednu ili vie
procesorskih jezgri, ali je bitno da je memorija koju procesori koriste dostupna
svakome od njih (slika 3.1. i slika 3.2.). Napravljen je za lako paraleliziranje
uglavnom kratkih odsjeaka teksta programa (slika 3.3.), koristei pretprocesorske
naredbe, biblioteke te varijable okruja. Iako se lako koristi, sve je preputeno
programeru koji mora sam paziti na mogue probleme pri paralelizaciji te zadati
parametre potrebne za rad OpenMP-a. Osnovna ideja OpenMP-a je bila da se
paralelizacija postigne sa tri do etiri naredbe, ali sa svakom sljedeom
specifikacijom ta je ideja sve manje i manje izraena. Kroz esnaest godina,
OpenMP je doao do verzije broj 4.0. Radi sa veinom operacijskih sustava i
procesorskih arhitektura. U ovom zavrnom radu koristi se neto starija verzija 2.0
to je posljedica koritenja programskog okruenja Microsoft Visual Studio 2010.

## U sljedeem poglavlju emo obraditi samo najosnovnije pretprocesorske naredbe

potrebne za razumijevanje ovog zavrnog rada.

Slika 3.1. Model na kojem vie procesora dijeli zajedniki memorijski prostor (engl.
Uniform Memory Access)
Izvor: https://computing.llnl.gov/tutorials/openMP/, 8.6.2013.

Slika 3.2. Model na kojem postoji vie memorijskih prostora, ali se svakom od njih
moe pristupiti preko sabirnice (engl. Non-Uniform Memory Access)
Izvor: https://computing.llnl.gov/tutorials/openMP/, 8.6.2013.

Slika 3.3. Ilustracija viedretvenosti gdje se glavna dretva grana na vie dretvi
kako bi se izvrio neki paralelni zadatak
Slika preuzeta sa http://en.wikipedia.org/wiki/OpenMP, 8.6.2013. i modificirana za

## 3.3 Osnovne pretprocesorske naredbe standarda OpenMP

Kao to smo ve rekli, u ovom radu koristimo programsko okruenje
Microsoft Visual Studio 2010 koji dolazi sa predinstaliranim OpenMP-jem verzije
2.0. Ovdje neemo obraivati funkcije iz biblioteke omp.h niti varijable okruenja
(engl. environment variables) jer nisu potrebni za ovaj rad.

## 3.3.1. Naredba PARALLEL

Pomou naredbe #pragma omp parallel prevoditelju govorimo da elimo
paralelizirati prvi sljedei blok naredbi. Tu se mogu navesti parametri poput broja
dretvi koje e biti stvorene, koje varijable su dijeljene, a koje privatne i sl. Ukoliko
nije drugaije navedeno, svaka dretva e izvriti blok programa koji se nalazi

## 3.3.2. Naredba SINGLE

Naredba #pragma omp single se mora nalaziti unutar bloka definiranog
naredbom #pragma omp parallel. Oznaava dio programa koji e izvriti samo
jedna dretva dok e ostale ekati na njegovo izvrenje.

## 3.3.3. Naredba FOR

Naredba #pragma omp for se takoer mora nalaziti unutar bloka programa
definiranog naredbom #pragma omp parallel. Nakon njega mora slijediti for petlja
koja e se paralelizirati. Tu moemo zadati iste parametre kao i kod naredbe
parallel, ali i neke dodatne kao to su schedule (odreuje koliko e iteracija petlje
preuzeti pojedina dretva odjednom), da li e se svaka iteracija izvravati
redoslijedom kojim je zadana, i jo neke naredbe koja nisu bitne za ovaj rad.
Mogue je kombinirati naredbu omp parallel sa naredbom omp for u naredbu
#pragma omp parallel for.

## 3.3.4. Naredba CRITICAL

Naredba #pragma omp critical oznaava kritini odsjeak koji e biti
zakljuan sa mutex kljuem, tj. samo jedna dretva e moi izvravati taj dio. Druge
dretve moraju ekati dok ta jedna dretva ne zavri, a potom ulazi ponovno samo
jedna dretva.

4. Paralelizirani algoritmi
U ovom poglavlju emo pogledati sve algoritme koji su trenutno napisani za
ECF, tj. njihove metode advanceGeneration koja predstavlja glavni dio
evolucijskog algoritma. Neki od algoritama su uspjeno paralelizirani, a neke se
jednostavno nije moglo paralelizirati zbog ogranienja OpenMP-a i konkretne
implementacije ECF-a. Glavni razlog za to je nemogunost pisanja jedne OpenMP
naredbe koja bi se protezala kroz vie blokova programa istovremeno. To povlai
za sobom ne samo nemogunost paraleliziranja nekih algoritama nego i daleko
loiju efikasnost. Konkretno, kod svakog poziva metode advanceGeneration, tj.
kod svake sljedee generacije, potrebno je stvarati novi skup dretvi to je
vremenski vrlo zahtjevna operacija. Zbog toga neki algoritmi koji su uspjeno
paralelizirani daju loije rezultate od slijednih varijanti.
Sva mjerenja pokazana u sljedeim potpoglavljima provedena su nad
problemom minimizacije Rosenbrockove funkcije sa sljedeim parametrima:
dimenzija problema: 1000
veliina populacije: 1000
vjerojatnost mutacije pojedine jedinke: 0.3
uvjet zaustavljanja: izvreno 1,000,000 evaluacija jedinki
broj ponavljanja pojedinog algoritma: 5
Rosenbrockova funkcija definirana je za dvodimenzijski vektor kao

sa

globalnim

minimum

toki

formula

je

definirana

kao

## U tom sluaju, minimum je postignut za N-dimenzijski vektor u toki za koju vrijedi

da su svi elementi vektora jednaki jedan.

## Vano je jo za napomenuti da je unutar ECF-a promijenjena metoda

evaluate tako da ne sprema u kontekst pokaziva na jedinku koja se trenutno
evaluira jer se taj pokaziva ne moe deklarirati kao privatna varijabla svake
dretve to efektivno onemoguava paralelizaciju.
Slian problem pojavio se pri pokuaju viedretvene paralelizacije petlje
koja prolazi po svim subpopulacijama. Ona, naime, koristi pokaziva na
subpopulaciju koja trenutno izvrava metodu advanceGeneration. Taj problem se
naalost ne moe rijeiti tehnikama koje smo upotrijebili kod metode evaluate.

## 4.1. Differential Evolution

Ovaj algoritam se naalost nije mogao paralelizirati iz sljedeeg razloga:
jedini dio koji bi se mogao paralelizirati je evaluacija jedinki, ali problem je u tome
to se unutar iste for petlje nalazi i zamjena jedinki unutar subpopulacije (slika
4.1.), a ta naredba koristi varijablu zapisanu u datoteci State.h (pokaziva na
subpopulaciju koja se trenutno obrauje) te zbog ogranienja OpenMP-a nije
mogue deklarirati tu varijablu privatnom za svaku dretvu.

## Slika 4.1. Dio teksta programa iz algoritma Differential Evolution napisanog za

ECF

4.2. Elimination
Kratak pseudokod:
jedna generacija {
eliminiraj (uitani_faktor * veliina_subpopulacije) najgorih jedinki;
stvori jednako toliko novih jedinki krianjem preostalih;

## mutiraj novu generaciju;

}
Ono to je napravljeno kod ovog programa je paralelizacija evaluacije svih
jedinki koja se odvija pred kraj svake generacije (slika 4.2.).

## Ubrzanje postignuto paralelizacijom prikazano je u tablici 4.1. te na slici 4.3.

U tablici su navedene prosjene vrijednosti dobivene iz pet uzastopnih pokretanja
algoritma. Razmatrano je izvoenje na jednoj, dvije te etiri procesorske jezgre.

## Tablica 4.1. Rezultati mjerenja kod izvravanja algoritma Elimination

Broj

fit_min

fit_max

fit_avg

fit_std

time [s]

ubrzanje

1,02*1014

1,39*1016

1,11*1016

1,67*1015

514,2

1,32*1014

8,98*1015

7,11*1015

1,66*1015

389,8

1,32

1,21*1014

1,41*1016

1,10*1016

1,36*1015

353,0

1,46

jezgri

10

Slika 4.3. Grafiki prikaz ovisnosti vremena izvoenja o broju jezgri na kojima se
algoritam izvodi

## 4.3. Genetic Annealing

Kratak pseudokod:
jedna generacija {
banka_energije = 0;
za svaku jedinku {
mutant = mutiraj (jedinka);
ako je dobrota (mutant) < dobrota (jedinka) + prag (jedinka) {
razlika = dobrota(jedinka) + prag(jedinka)
dobrota (mutant);
banka_energije += razlika;
zamijeni (jedinka, mutant);
}
}
razlika_energije = banka_energije * faktor_hlaenja / broj_jedinki;
za svaku jedinku {

11

## prag (jedinka) += razlika_energije;

}
}
U ovom algoritmu je paralelizirana petlja koja se koristi za mutaciju i
evaluaciju svake zasebne jedinke unutar generacije te njihovu zamjenu u
populaciji ukoliko je ispunjen uvjet zamjene (slika 4.4.). Treba samo pripaziti na
injenicu da metoda replaceWith stvara probleme ukoliko ju vie razliitih dretvi
pozove istovremeno pa je stoga stavljena unutar kritinog odsjeka. Isto vrijedi i za
naredbu mutate.

Slika 4.4. Dio teksta programa iz algoritma Genetic Annealing napisanog za ECF

## Ubrzanje postignuto paralelizacijom prikazano je u tablici 4.2. te na slici 4.5.

U tablici su navedene prosjene vrijednosti dobivene iz pet uzastopnih pokretanja

12

## Tablica 4.2. Rezultati mjerenja kod izvravanja algoritma Genetic Annealing

Broj

fit_min

fit_max

fit_avg

fit_std

time [s]

ubrzanje

8,77*1015

7,62*1015

1,03*1016

3,99*1014

287,0

8,90*1015

7,81*1015

6,62*1015

4,69*1014

148,0

1,94

8,83*1015

1,19*1016

6,62*1015

3,97*1014

88,8

3,23

jezgri

Slika 4.5. Grafiki prikaz ovisnosti vremena izvoenja o broju jezgri na kojima se
algoritam izvodi

13

4.4. Hooke-Jeeves
Kratak pseudokod:
jedna generacija {
za svaku jedinku {
mutant = mutiraj (jedinka);
dijete = kriaj (jedinka, mutant)
ako je dobrota (dijete) > dobrota (jedinka) {
zamijeni (jedinka, dijete);
}
}
}
Ukratko, svaka jedinka unutar generacije nezavisno od drugih jedinki
pretrauje prostor moguih rjeenja te je upravo zbog te neovisnosti bilo mogue
paralelizirati cijeli dio programa koji se odnosi na jednu generaciju. Pseudokod
ovog

algoritma

moe

se

pronai

na

stranici

Ubrzanje postignuto paralelizacijom prikazano je u tablici 4.3. te na slici 4.6.
U tablici su navedene prosjene vrijednosti dobivene iz pet uzastopnih pokretanja
algoritma. Razmatrano je izvoenje na jednoj, dvije te etiri procesorske jezgre.

## Tablica 4.3. Rezultati mjerenja kod izvravanja algoritma Hooke-Jeeves

Broj

fit_min

fit_max

fit_avg

fit_std

time [s]

ubrzanje

9,75*1015

1,29*1016

1,13*1016

4,92*1014

393,6

8,03*1015

1,06*1016

1,13*1016

4,87*1014

199,8

1,97

6,36*1015

1,29*1016

9,27*1015

4,88*1014

112,8

3,49

jezgri

14

Slika 4.6. Grafiki prikaz ovisnosti vremena izvoenja o broju jezgri na kojima se
algoritam izvodi

## 4.5. Particle Swarm Optimization

Ni ovaj algoritam neemo objanjavati zbog njegove sloenosti. Ukratko,
estice (jedinke) se kreu zajedno, pritom imitirajui roj. Budui da se moraju
kretati zajedno i pritom pristupati dijeljenim varijablama, mogao se paralelizirati
samo jedan mali dio algoritma koji i nije ba toliko dobro utjecao na ubrzanje
algoritma. Sporije izvoenje algoritma na vie dretvi je posljedica stvaranja skupa
dretvi pri svakoj novoj generaciji.
Ubrzanje postignuto paralelizacijom prikazano je u tablici 4.4. te na slici 4.7.
U tablici su navedene prosjene vrijednosti dobivene iz pet uzastopnih pokretanja
algoritma. Razmatrano je izvoenje na jednoj, dvije te etiri procesorske jezgre.

15

Optimization
Broj

fit_min

fit_max

fit_avg

fit_std

time [s]

ubrzanje

3,35*1012

6,67*1013

9,49*1012

7,17*1012

417,0

3,32*1012

5,53*1013

9,29*1012

5,11*1012

415,2

1,01

2,09*1012

7,06*1013

9,37*1012

4,37*1012

421,8

0,99

jezgri

## Slika 4.7. Grafiki prikaz ovisnosti vremena izvoenja o broju jezgri na

kojima se algoritam izvodi

## 4.6. Roulette Wheel

Kratak pseudokod:
jedna generacija {
stvori novu generaciju od starih jedinki;
broj_krianja = veliina_populacije * koeficijent_krianja / 2;
ponavljaj (broj_krianja) {

16

## nasumino izaberi dva roditelja;

izvedi krianje i zamijeni roditelje sa djecom;
}
mutiraj novu generaciju;
}
U ovom algoritmu su paralelizirane dvije petlje. Prva obavlja kopiranje
jedinki za novu generaciju (slika 4.8.), a druga obavlja evaluaciju (slika 4.9.).
Naredba pragma omp parallel je pozvana na poetku metode advanceGeneration
kako bi se izbjeglo dvostruko stvaranje skupa dretvi unutar te iste metode.
Odsjeci programa koje ne elimo paralelizirati su unutar bloka programa prije
kojeg stoji naredba pragma omp single.

Slika 4.8. Dio teksta prorgrama iz algoritma Roulette Wheel napisanog za ECF

Slika 4.9. Dio teksta programa iz algoritma Roulette Wheel napisanog za ECF

## Ubrzanje postignuto paralelizacijom prikazano je u tablici 4.5. te na slici

4.10. U tablici su navedene prosjene vrijednosti dobivene iz pet uzastopnih
pokretanja algoritma. Razmatrano je izvoenje na jednoj, dvije te etiri
procesorske jezgre.

17

Broj

fit_min

fit_max

fit_avg

fit_std

time [s]

ubrzanje

6,54*1011

6,08*1013

1,16*1013

1,30*1013

378,8

4,97*1011

8,66*1013

9,19*1012

1,53*1013

239,8

1,58

6,46*1011

7,98*1013

9,28*1012

1,28*1013

171,2

2,21

jezgri

## Slika 4.10. Grafiki prikaz ovisnosti vremena izvoenja o broju jezgri na

kojima se algoritam izvodi

18

## 4.7. Steady State Tournament

Kratak pseudokod:
jedna generacija {
ponavljaj veliina_populacije puta {
nasumino izaberi unaprijed_zadani_broj_puta jedinki;
izaberi najgoru od njih;
nasumino izaberi dva roditelja od preostalih odabranih;
zamijeni najgoru jedinku sa novim djetetom;
mutiraj dijete;
}
}
Program napisan u ECF-u za ovaj algoritam naalost nije mogue
paralelizirati jer se glavna petlja unutar jedne generacije odvija za jednu po jednu
jedinku koja u svakom trenutku mora znati sve informacije o ostalima. Poto se
ostale jedinke mijenjaju sa svakim prolazom, sa trenutnom implementacijom
OpenMP-a nije mogue paralelizirati taj program.

19

5. Zakljuak
Iako tehnologija OpenMP jo uvijek nije dovoljno zrela za koritenje sa
objektno-orijentiranim jezicima zbog niza nedostataka (poput nemogunosti
izdvajanja varijabli objekata za svaku dretvu zasebno, nemogunost kontrole pri
paralelizaciji metoda koje se ne nalaze unutar omp parallel bloka, a pozvane su iz
tog bloka i sl.), dosta uspjeno se paraleliziralo veinu algoritama koji trenutno
postoje u ECF-u. Kod nekih dodue nije postignuto nikakvo ubrzanje zbog
relativno skupe operacije stvaranja skupa dretvi pri svakom pozivu metode
advanceGeneration. To se nije moglo drugaije napraviti (kao npr., stvoriti skup
dretvi samo pri inicijalizaciji programa pa da se kasnije tim dretvama proslijedi
posao) jer OpenMP trenutno to ne dozvoljava. Ipak, vei dio se uspjeno
paralelizirao i pokazao jako dobre rezultate. Postignuta su velika ubrzanja (kod
nekih je vrijeme izvoenja smanjeno na manje od trideset posto pri paralelnom
izvoenju na etiri dretve).
Mislim da e ovaj zavrni rad biti od velike koristi za sve koji namjeravaju
koristiti ECF u budunosti. Omoguit e im ili veliku utedu vremena ili postizanje
boljih rezultata u jednakom vremenu. Takoer, nee imati problema sa
instalacijom dodatnih programa kao to je to sluaj sa MPI-jem (Message Passing
Interface) koji je trenutno implementiran za paralelno izvoenje odreenih
algoritama u ECF-u. Jednom kada je program preveden zajedno sa OpenMP-jem,
moe se pokretati na skoro svim operacijskim sustavima bez potrebe za dodatnim
instalacijama ili podeavanjima ikakvih parametara (iako omoguava podeavanje
parametara preko varijabli okoline, ali ne zamara korisnika s time).

20

6. Literatura
1. Golub, M. (2004.), Skripta Genetski algoritam u dva dijela,
http://www.zemris.fer.hr/~golub/ga/ga_skripta1.pdf,
http://www.zemris.fer.hr/~golub/ga/ga_skripta2.pdf
2. Pseudokod algoritma Hooke-Jeeves,
3. Predavanja iz kolegija Paralelno programiranje,
avanja%5B8%5D.pdf
4. OpenMP tutorial, https://computing.llnl.gov/tutorials/openMP/
5. lanak Reap the Benefits of Multithreading without All the Work o
implementaciji OpenMP-a unutar programskog okruenja Visual Studio,
http://msdn.microsoft.com/en-us/magazine/cc163717.aspx
6. Microsoftove slubene stranice za Visual C++ i OpenMP,
http://msdn.microsoft.com/en-us/library/tt15eb9t%28v=vs.100%29.aspx
7. Rosenbrockova funkcija, http://www-optima.amp.i.kyotou.ac.jp/member/student/hedar/Hedar_files/TestGO_files/Page2537.htm

## Napomena: Za probleme vezane uz programiranje koritena je stranica Stack

Overflow (http://stackoverflow.com) na kojoj se postavljaju pitanja i dobivaju
odgovori od strunjaka iz podruja programskog inenjerstva.

21

7. Saetak
Viedretvena paralelizacija evolucijskih algoritama
Ovaj rad bavi se paralelizacijom evolucijskih algoritama napisanih za ECF
(Evolutionary Computational Framework) koristei tehnologiju OpenMP. Neki
algoritmi su uspjeno paralelizirani sa znatnim poboljanjem to se tie vremena
izvoenja, neki malo manje uspjeno, a neke jednostavno nije bilo mogue
paralelizirati zbog ogranienja OpenMP-a.
Znaajna vremenska uteda uz jednostavnost koritenja (nisu potrebne
nikakve dodatne instalacije nakon prevoenja programskog koda) biti e od velike
koristi za sve koji e koristiti ECF u budunosti.
Kljune rijei: ECF, Evolutionary Computational Framework, OpenMP, Open
Multi Processing, viedretvenost
Multithread parallelization of evolutionary algorithms
This paper deals with parallelization of evolutionary algorithms written for
ECF (Evolutionary Computational Framework) using OpenMP. Some algorithms
were successfully altered to run on more processor cores with significant
improvement in runtime and some werent as successful while others were
impossible to alter due to limitations of OpenMP.
Significant improvement in runtime as well as ease of use (no other
installations are required after compiling the source code) will benefit everyone
using ECF.
Keywords: ECF, Evolutionary Computational Framework, OpenMP, Open Multi