Vidi Project X #89: Višejezgrena okolina

Vidi Project X #89: Višejezgrena okolina

Vidi X u višejeugrenoj okolini

ESP32 LX6 procesor, inače srce VIDI Project X-a i proizvod tvrtke Espressif Systems, podržava višejezgreni rad i to u malom pakiranju.

Višejezgreni procesori nisu nikakva novost, odnosno već 20 godina postoje na komercijalnom tržištu. Različite mikroprocesorske arhitekture prihvatile su višejezgrenost kao standard u računalstvu koje ipak doseže svoje krajnje granice.

Xtensa LX6 procesor našeg X-a je low cost i low power procesor kojeg “krasi” i višejezgrenost. Kako “zaposliti” obje jezgre na primjeru našeg mini projekta, pročitajte u nastavku...

 

Malo o Moorevom zakonu i više jezgri

Prema originalnom Mooreovom zakonu iz 1975. godine, broj tranzistora na jednom čipu udvostručuje se svake godine. Davno je bila ta 1975., a Mooreov zakon prošao je kroz nekoliko “nadogradnji”. Bez obzira na tako dug period postojanja, Mooreov zakon neće vrijediti beskonačno jer će tehnologija u jednom trenutku dosegnuti granicu fizičkih zakona.

I sam je Moore vjerovao da će Zakon trajati 30 godina, ali je u stvarnosti to trajalo puno duže i tako bi trebalo biti sve do skorašnje 2025. godine. Međutim, i tu su razna špekuliranja o tome da će se “produžiti trajanje”, kao što je do bilo i ranijih godina jer broj tranzistora po procesoru i dalje eksponencijalno raste.

Međutim, kada se priča o radnom taktu procesora, on je prestao rasti još 2005. godine, a kao razlog navodi se povećanje potrošnje struje, a time i veće zagrijavanje.

 

image 1

Proizvođači su se zato okrenuli drugačijoj priči u povećanju performansi procesora te umjesto povećanja brzine, povećali su broj CPU-a na jednom mikroprocesorskom čipu, odnosno nastali su višejezgreni procesori.

Prvi komercijalni višejezgreni procesor izašao je iz IBM-ovih laboratorija i to pod nazivom IBM POWER4 davne 2001. godine. On je s dvije 64-bitne procesorske jezgre radio na 1.1 GHz ili 1.3 GHz, a sadržavao je 174 milijuna tranzistora.

No, tu pričamo o dva potpuno različita pristupa u povećanju brzine: dok smo kod povećanjem takta procesora dobivali linearno povećanje brzine izvršavanja programa, kod koncepta višejezgrenih procesora nužna je prilagodba u pisanju programa da bi isti iskoristio više jezgri.

 

Malo o projektu

Iako ne spade u kategoriju POWER4 CPU-u, prema tehničkom opisu Xtensa ESP32 LX6 procesor, inače srce VIDI X projekta i proizvod tvrtke Espressif Systems, podržava višejezgreni rad i to u malom pakiranju.

 

image 2

Neke osnovne značajke ESP32 Xtensa LX6 mikroprocesora:

■ CPU: Espressif Systems Xtensa dual-core (or single-core) 32-bit LX6 mikroprocesor, na taktu od 160 ili 240 MHz @ up to 600 DMIPS

■ Ultra low power (ULP) co-processor

■ Memory: 520 KB SRAM

Ideja projekta je demonstrirati višejezgreni rad tako da svaka pojedina jezgra procesora preuzme izvršavanje našeg testnog koda (programa). Jedan program palit će plavu lampicu na našem X-u, a drugi program također će paliti lampicu, samo uz nešto kraći delay. Izvršavanje programa pratit će obavijest na LCD-u o trenutno aktivnom procesu i jezgri koja ga izvršava (0 ili 1, odnosno prva ili druga jezgra).

 

image 3

Funkcija koju ćemo koristiti za detekciju jezgre koja izvršava program je xPortGetCoreID()

Sljedeće što moramo učiniti je kreirati zadatak (Task) za svaki proces koji će se izvršavati. Naš prvi proces nosit će naziv Task1 i palit će plavu lampicu na X-u, a drugi proces naziv Task2 također će paliti lampicu, samo uz kraći delay. To činimo pomoću naredbe TaskHandle_t naziv_zadatka.

TaskHandle_t Task1; // definiramo zadatak

TaskHandle_t Task2; // definiramo zadatak

/ pinovi LED

const int led1 = 2; // definiramo pin spojene LED-ice

const int led2 = 2; // definiramo pin spojene LED-ice

Zatim je potrebno “pridružiti” kreirane zadatke (Tasks) koji će se izvršavati na svakoj pojedinoj CPU jezgri. Slijedi funkcija xTaskCreatePinnedToCore koja ima nekoliko važnih argumenata i to:

Task1code, /* Funkcija koja će implementirati zadatak */

“Task1”, /* Ime prethodno kreiranog zadatka */

10000, /* veličina stacka u riječima */

NULL, /* Task input parameter */

0, /* Prioritet zadatka */

&Task1, /* Upravljanje zadatkom */

0); /* Procesorska jezgra gdje će se zadatak izvršavati */

 

20200315 203821

Nakon stvaranja zadataka-taskova, potrebno je stvoriti funkcije koje će izvršavati te zadatke. Obratite pozornost na korištenje funkcije void * što znači da funkcija može preuzeti pokazivač (pointer) koji ne mora biti specifičnog tipa.

void Task1code( void * pvParameters ){

Serial.print(“Zadatak 1 se izvršava na jezgri”);

Serial.println(xPortGetCoreID()); // kreira zadatak koji će biti izvršen u Task1code i Task2code funkciji

for(;;){

digitalWrite(led1, HIGH);

delay(1000);

digitalWrite(led1, LOW);

delay(1000);

}

}

Ocijeni sadržaj
(0 glasova)

// možda će vas zanimati

Newsletter prijava


Kako izgleda naš posljednji newsletter pogledajte na ovom linku.
Copyright © by: VIDI-TO d.o.o. Sva prava pridržana.