METODY OPTYMALIZACJI KODU WYNIKOWEGO UWZGLĘDNIAJĄC KRYTERIUM CZASU WYKONYWANIA OBLICZEŃ, ZA POMOCĄ KOMPILATORA I TECHNIK PROGRAMISTYCZNYCH.

Wielkość: px
Rozpocząć pokaz od strony:

Download "METODY OPTYMALIZACJI KODU WYNIKOWEGO UWZGLĘDNIAJĄC KRYTERIUM CZASU WYKONYWANIA OBLICZEŃ, ZA POMOCĄ KOMPILATORA I TECHNIK PROGRAMISTYCZNYCH."

Transkrypt

1 POZNAŃSKIE CENTRUM SUPERKOMPUTEROWO SIECIOWE METODY OPTYMALIZACJI KODU WYNIKOWEGO UWZGLĘDNIAJĄC KRYTERIUM CZASU WYKONYWANIA OBLICZEŃ, ZA POMOCĄ KOMPILATORA I TECHNIK PROGRAMISTYCZNYCH. Wykorzystanie przełączników kompilatora GCC i ICC, wielowątkowości, MPI oraz OpenMP. Autor: Arkadiusz Mądrawski Prowadzący: dr inż. Marcin Lawenda Data: Miejsce: Poznań. Niniejsza praca dotyczy wykorzystywania technik programistycznych i dostępnych narzędzi do optymalizacji kodu w kryterium czasu wykonywania kompilatu. W pracy porównane zostały dwa kompilatory: GCC oraz ICC z dostępnymi przełącznikami optymalizacyjnymi. Porównano również techniki programistyczne takie jak: wielowątkowość, MPI oraz OpenMP. Wykazano zależności czasowe czasu wykonywania obliczeń od zastosowanych technik i narzędzi, dla wybranych eksperymentów.

2 1 WPROWADZENIE 4 2 ZASADY EFEKTYWNEGO PROGRAMOWANIA WSTĘP OBLICZANIE STAŁYCH DOPASOWANIE TYPÓW DO WARTOŚCI WYRZUCANIE NIEZMIENNIKÓW PĘTLI POZA CIAŁO UPRASZCZANIE WYRAŻEŃ LOGICZNYCH I ALGEBRAICZNYCH ŁĄCZENIE INSTRUKCJI ŁĄCZENIE PĘTLI PĘTLA O MALEJĄCYM ITERATORZE OPERACJE NA SZYBSZYCH OPERANDACH SPŁASZCZANIE PĘTLI ELIMINACJA ZBĘDNYCH WYRAŻEŃ WYKONANE OBLICZENIA SPRAWDZANIE WARUNKÓW ZWIĘKSZENIE SKOKU PĘTLI PRZEKAZYWANIE DUŻYCH DANYCH KONSTRUKCJA WZAJEMNEGO WYKLUCZANIA WARTOŚCI LENIWE PODSUMOWANIE ZASAD EFEKTYWNEGO PROGRAMOWANIA 13 3 PRZEŁĄCZNIKI WYBRANYCH KOMPILATORÓW KOMPILATOR GCC PRZEŁĄCZNIKI TYPU O[X] FLAGI OPTYMALIZACYJNE OBLICZENIOWE FLAGI OPTYMALIZACYJNE ARCHITEKTURALNE KOMPILATORA ICC PRZEŁĄCZNIKI TYPU O[X] FLAGI OPTYMALIZACYJNE OBLICZENIOWE FLAGI OPTYMALIZACYJNE ARCHITEKTURALNE 16 4 WIELOWĄTKOWOŚĆ PROGRAMÓW 17 5 OPENMP WSTĘP DO OPENMP PRAGMY W OPENMP PRAGMA PARALEL PRAGMA FOR KLAUZULA ORDERED KLAUZULA SCHEDULE 19 1 S trona

3 5.2.5 KONSTRUKCJA BARIER KONSTRUKCJA MASTER KONSTRUKCJA CRITICAL KONSTRUKCJA ATOMIC DYREKTYWA FLUSH 21 6 MPI WSTĘP DO MPI OPTYMALNA KOMUNIKACJA W MPI ANALIZA KOMUNIKACJI W MPI NA PODSTAWIE PROGRAMU VAMPIR ANALIZA PRZEPROWADZONEGO TESTU 25 7 EKSPERYMENTY TEST PRZEZNACZONY DLA KOMPILATORÓW GCC I ICC TEST PRZEZNACZONY DLA WIELOWĄTKOWOŚCI TEST PRZEZNACZONY DLA OPENMP TEST PRZEZNACZONY DLA MPI 31 8 ŚRODOWISKO EKSPERYMENTÓW MASZYNA NO MASZYNA NO WYNIKI TESTÓW PRZY UŻYCIU KOMPILATORÓW GCC I ICC PRZEŁĄCZNIKI PODSTAWOWE KOMPILATORÓW EKSPERYMENT PIERWSZY EKSPERYMENT DRUGI FLAGI ROZSZERZAJĄCE KOMPILATORÓW EKSPERYMENT PIERWSZY SZYBKOŚĆ VS. JAKOŚĆ PODSUMOWANIE PORÓWNANIA KOMPILATORÓW WYNIKI TESTÓW PRZY UŻYCIU WIELOWĄTKOWOŚCI OPTYMALNE ZARZĄDZANIE WĄTKAMI W EKSPERYMENCIE EKSPERYMENT PIERWSZY EKSPERYMENT DRUGI PODSUMOWANIE PROGRAMU WIELOWĄTKOWEGO PORÓWNANIE PROGRAMU WIELOWĄTKOWEGO I SEKWENCYJNEGO 55 2 S trona

4 11 WYNIKI TESTÓW PRZY UŻYCIU OPENMP ORAZ MPI OPENMP ZARZĄDZANIE PRAGMAMI EKSPERYMENT PIERWSZY EKSPERYMENT DRUGI SZYBKOŚĆ ZA JAKOŚĆ PODSUMOWANIE MPI EKSPERYMENT PIERWSZY MPI+OPENMP PODSUMOWANIE WNIOSKI SPIS 75 BIBLIOGRAFIA 75 RYSUNKÓW 75 RÓWNAŃ 75 SPIS TABEL 76 WYKRESÓW 76 FIGURE 78 3 S trona

5 1 Wprowadzenie W systemie, w którym program musi wykonać szereg obliczeń numerycznych, obok poprawności wyników, istotnym elementem jest czas pozyskania wyników. Uzyskanie większej szybkości wykonywania obliczeń, co za tym idzie, szybszego przetwarzania danych, odgrywa kluczowe znaczenie w miejscu, gdzie danych do obróbki jest dużo. Takimi danymi zazwyczaj są przekazy wizyjne. Mogą być one dynamiczne lub quasi-statyczne. Obróbka takiej liczby danych zazwyczaj zajmuje więcej czasu niż ich pozyskanie. Polepszenie szybkości działania programu, przy zachowaniu jego zgodności, co do poprawności wyznaczanych danych, jest pożądanym efektem. Również, gdy danych do przetworzenia jest niewiele, lecz na danych tych trzeba wykonać czasochłonne obliczenia numeryczne. Jest kilka możliwości, które pozwalają zwiększyć szybkość działania programu. Są to metody, począwszy od zastosowania odpowiedniego kompilatora i jego przełączników. Takie postępowanie nie wymusza pisania kodu programu od początku, czy też jakąkolwiek zmianę strukturalną kodu wykonaną przez programistę. Następne metody polegają na zmianie struktury kodu, w celu wykorzystania największej ilość mocy obliczeniowej, która może być wykorzystana przez pracujący program. Takimi technikami są np. wątki, OpenMP oraz MPI. Postępowanie optymalizacyjne zależy głównie od tego, co ma wykonywać program. Generalnie, optymalizację rozpoczyna się od programisty, który odpowiada na pytanie: Czy zmieniając tą linię kodu uzyskam szybsze wyniki działania małym nakładem sił na zmianę linii kodu?. Te pytanie odnosi się do podstawowych zasad programistycznych, których główną ideą jest: nie wykonuj obliczeń niepotrzebnie. Następnie, gdy programista stwierdził, że nie ma sobie nic do zarzucenia, można spróbować wykonać optymalizację wykorzystując podstawowe narzędzia, jakimi są kompilatory języka. Kompilatory, prócz tego, iż przetwarzają język zrozumiały dla człowieka, na język zrozumiały dla maszyny, posiadają gamę przełączników, lub też flag, które można ustawić podczas kompilacji programu. Flagi te mają za zadanie optymalizować kod w kategoriach: czas wykonywania obliczeń lub wielkość zajmowanego miejsca. Typy flag określa się, jako: ogólną optymalizację lub też na specyficzną technikę obliczeń. W pracy tej wybrano dwa kompilatory: GCC oraz ICC, wraz z kilkoma przykładowymi przełącznikami, celem pokazania, jak posługiwać się przełącznikami, aby kompilat być wydajniejszy w czasowym kryterium. Kroki powyższe posiadają niezwykła zaletę. Nie trzeba dużo manipulować przy kodzie, aby osiągnąć lepsze wyniki w wybranym kryterium. Jednak posiadają wadę, iż przy tych technikach nie uzyska się maksymalnego efektu. Efekt taki, można uzyskać, wtedy, gdy wykorzysta się całą dostępną moc obliczeniową. Jednak takie podejście, wymaga zazwyczaj pisania kodu od podstaw, z użyciem zaawansowanych technika przetwarzania danych. Taki technikami mogą być programy wielowątkowe, wielordzeniowe, rozproszone, czyli podpadające pod zasadę: im więcej mocy mogę wykorzystać, tym lepiej. Warto podkreślić, iż wybór odpowiedniego podejścia optymalizacyjnego, zależy głównie od chęci zmiany, możliwych nakładów przeznaczonymi na wykonanie optymalizacji oraz rzeczywistym zyskiem czasowym. Dlatego nie trzeba wykorzystywać wszystkich tych technik i zwyczajów. Można spróbować dowolnej gałęzi optymalizacyjnej, dopasowanej do swoich potrzeb. W celu pokazania, jakie przyspieszenia czasowe można osiągnąć wykonano po dwa eksperymenty dla każdego zestawu przełączników kompilatorów, oraz zmiany struktury kodu z sekwencyjnego na wydajniejsze, kolejno: wielkowątkowe, OpenMP oraz MPI. Przeprowadzone eksperymenty to: 4 S trona

6 1. Mnożenie dwóch macierzy kwadratowych o elementach całkowitoliczbowych. 2. Mnożenie dwóch macierzy kwadratowych o elementach zmiennoprzecinkowych. Warto zaznaczyć, że poniższa analiza nie musi mieć charakteru globalnego. Wartości poszczególnych przyspieszeń mogą zależeć od maszyny a przede wszystkim od umiejętności algorytmicznych i numerycznych programisty. 5 S trona

7 2 Zasady Efektywnego Programowania 2.1 Wstęp Zasady przedstawione w tym rozdziale mają na celu przyspieszenie wykonywania kody wynikowego, zaczynając od poprawy techniki programowania autora kodu. Zasady te zostały wybrane według reguły: kilka z wielu. Pozwalają one na efektywniejsze zagospodarowanie jednostki obliczeniowej oraz przyszykowanie kodu do lepszej optymalizacji w przyszłości. Warto zaznaczyć, że korzystanie z poniższych zasad nie przyspieszy znacząco działania programu na liczbę instrukcji optymalizowanych. Jednak optymalizacja przez te zasady może przynieść znaczący skutek, gdy operacji wykonywanych w miejscach newralgicznych, jest dużo, czyli gdy liczba iteracji jest znacząca dla miejsca optymalizacji. Poniższe zasady zostały wybrane i opisane bez technologii know-how, więc nie trzeba posiadać wiedzy informatycznej, aby jest stosować i zrozumieć. W celu polepszenia swojej techniki programowania warto zajrzeć do dodatkowej literatury, opisującej głębsze relacje między kodem pisanym a wynikowym. 2.2 Obliczanie stałych Obliczenie wartości wyrażenia, gdy jest ono długie, warto wykonać osobno i wpisać do zmiennej gotowy wynik. Nieoptymalnie: long x = 12*72+13* *( ) + 735* * *76532; Optymalnie: //12*72+13* *( )+735* *765-43*76532 long x = 55219; 2.3 Dopasowanie typów do wartości Jeżeli wiadomo, jakie wartość będą przyjmowane przez określone zmienne, warto dopasować określony typ do rozpatrywanej zmiennej tak, aby dopasowanie było jak najlepsze, w kryterium wykorzystania wszystkich liczb z zakresu typu do zakresu wartości zmiennej. Mamy kilka liczb: 17;-73;[-500,200];[0,100]; ; -9.23; Nieoptymalnie: int x1=17; int x2=-73; int x3a=-500; int x4a=0; int x5 = ; double x6 = -9.23; Optymalnie: unsigned char x1=17; signed char x2=-73; //char x2=-73 signed short x3a = -500; //short x3a = -500 // for(x3a=-500;x3a<200;x3a++) unsigned char x4a=0; // for(x4a=0;x4a<100;x4a++) signed int x5 = ; //int x5 = signed float x6 = -9.23; //float x6 = S trona

8 2.4 Wyrzucanie niezmienników pętli poza ciało Przy wykonywaniu instrukcji w pętli, warto zastanowić się, czy niektóre zmienne są stałe względem tej pętli. Jeżeli jakaś zmienna jest stała względem tej pętli, to można ją wyrzucić poza ciało pętli. Wtedy program wykona mniej przypisań, więc wykonanie będzie szybsze. Nieoptymalnie: int tab[1000]; for(int i=0;i<1000;i++) { int s=5*8+9-(3+12*5-7*127)-111*3-541; //można również wyliczyć wartość. tab[i]=s; } Optymalnie: unsigned short tab[1000]; //dopasowanie zakresu do wartości unsigned char s=1; //wyliczona wartość oraz dopasowanie zakresu do wartości for(unsigned short i=0; i<1000; i++) tab[i]=s; 2.5 Upraszczanie wyrażeń logicznych i algebraicznych Często warunki, które zamieszczane są w programie są warunkami prostymi, jednoargumentowymi. Zdarzą się niekiedy, że sprawdzany warunek jest w bardzo rozbudowanej formie. Warto wtedy zastosować upraszczanie wyrażeń arytmetycznych i logicznych, korzystając z praw logiki, algebry. Nieoptymalnie: /*przykład 1*/ float licz(int x) { return ((5*8+9-(3+12*5-7*127)-111*3-539)*x+2*5+2-(7+9*4-8*183)-215*6-121)/(3*x+11); } /*przykład 2*/ bool test(bool spr1, bool spr2, bool spr3) { if((spr1 AND (spr2 OR spr3)) OR spr1 OR (spr2 AND (spr1 OR spr3)) AND (spr3 OR (spr1 AND spr2)) OR spr2 OR spr3) return true; else return false; } Optymalnie: /*przykład 1*/ float licz(int x) { return 1+11/(3*x+11); } /*przykład 2*/ 7 S trona

9 bool test(bool spr1, bool spr2, bool spr3) { if(spr1 OR spr2 OR spr3) return true; else return false; } 2.6 Łączenie instrukcji Gdy kolejne instrukcje wykonują podobne operacje, może je połączyć w jedną. Nieoptymalnie: int tab[10]; int x=10; for(int i=0;i<10;i++) { x=x+10; x=x-i; x=3*x+5; x=x+i; x=2*x+9; tab[i]=x; } Optymalnie: int tab[10]; int x=10; for(int i=0;i<10;i++) tab[i]=-4*i+6*x+79; 2.7 Łączenie pętli Jeżeli pętle posiadają ten sam warunek iteracyjny, można je połączyć w jedną pętle. Niekiedy można połączyć kilka pętli, które nie posiadają tego samego warunku iteracyjnego. Nieoptymalnie: /*przykład 1*/ int tab1[100]; int tab2[100]; int tab3[100]; int s=10; int w=11; for(int i=0;i<100;i++) tab1[i]=1; for(int j=0;j<100;j++) tab2[j]=tab1[j]+j+w; //tab2[j]=1+j+w; for(int k=0;k<100;k++) tab3[k]=k+s; /*przykład 2*/ int tab1[100]; int tab2[200]; 8 S trona

10 int tab3[50]; int s=10; int w=11; for(int i=0;i<100;i++) tab1[i]=1; for(int j=0;j<200;j++) tab2[j]=3*j+w; for(int k=0;k<50;k++) tab3[k]=k+s; Optymalnie: /*przykład 1*/ int tab1[100]; int tab2[100]; int tab3[100]; int s=10; int w=11; for(int i=0;i<100;i++) { tab1[i]=1; tab2[j]=tab1[j]+j+w; //tab2[j]=1+j+w; tab3[k]=k+s; } /*przykład 2*/ int tab1[100]; int tab2[200]; int tab3[50]; int s=10; int w=11; for(int i=0;i<200;i++) { if(i<50) { } tab1[i]=1; tab3[i]=i+s; else if(i<100) tab1[i]=1; // zawsze wykonaj przypisanie dla tab2 } tab2[i]=3*i+w; 2.8 Pętla o malejącym iteratorze Można stosować iterator i++ (++i) lub również i--(--i). Iterator drugi jest szybszy, bowiem warunek sprawdzający komputer wykonuje w jednym rozkazie (i>0) a nie w dwóch (i- 100>0). Nieoptymalnie: 9 S trona

11 for(int i=0;i<100;i++) tab[i]=3; Optymalnie: for(int i=100;i>0;i--) tab[i]=3; 2.9 Operacje na szybszych operandach Maszynie trudniej jest wykonać potęgowanie niż mnożenie czy dzielenie. Szybciej radzi sobie z dodawaniem i odejmowaniem. Jednak najszybciej wykonuje przesuniecie bitowe. Zamiast mnożyć/dzielić dwie liczby, można wykorzystać z przesunięcia bitowego i dodawania. Nieoptymalnie: long licz(int podaj) { } Optymalnie: return podaj*199; long licz(int podaj) { } return (podaj<<0) + (podaj<<1) + (podaj<<2) + (podaj<<6) + (podaj<<7); 2.10 Spłaszczanie pętli Zastępowanie kilku zagnieżdżonych pętli w jedną dłuższą. Nieoptymalnie: int tab[100][100]; for(int i=0;i<100;i++) for(int j=0;j<100;j++) tab[i][j]=i+j; Optymalnie: unsigned char tab[10000]; //bo 100*100 unsigned short it=0; unsigned char w=0; unsigned char k=0; for(it=0;it<10000;it++) { } if(w==100) {w=0; k++;} tab[it]=w+k; w++; 2.11 Eliminacja zbędnych wyrażeń Pomijanie instrukcji, dla których ich wynik będzie miał taką samą wartość. Zazwyczaj są to instrukcje pisane przez programistę w celu odszukania błędu w programie i kontrolowaniu poszczególnych wartości na każdym etapie algorytmu. Niekiedy jednak takie instrukcje nie są pisane w określonym celu, jakim jest np. szukanie błędu. Czasami programista pisze dwie 10 S trona

12 funkcje, które mają właściwie takie same ciała i dają identyczne wyniki. Zdarza się czasami, iż używa ich naprzemiennie. Warto wtedy pozostać przy jednej Wykonane obliczenia Najlepiej widać to w rozwinięciach w szereg Taylora. Załóżmy, że trzeba policzyć kolejne wyrazy dla skończonego rozwinięcia, w zwiniętym szeregu: Ideą takiego postępowania jest, iż jeżeli obliczona została potęgę dla x^7 to aby obliczyć x^9 nie trzeba ponownie obliczyć dla x^7. Więc, aby przyspieszyć obliczenia odszukano zależność między i-tym oraz (i+1)-szym wyrazem i skorzystano z tej zależności. Warto zwrócić uwagę, iż w takim podejściu można zredukować liczbę funkcji dodatkowych potrzebnych do obliczeń. Niekiedy zredukowane funkcje są czasochłonne. Nieoptymalnie: double wyraz(int pozycja, int x) { } Optymalnie: return potega(x,2*pozycja+1)/silnia(pozycja); //nie zagłębiam się jak wyglądają funkcje: potęga( ) oraz silnia( ) double wyraz(double poprzednik, int x, int pozycja) { } return poprzednik*potega(x,2)/(pozycja+1); //nie zagłębiam się jak wygląda funkcja potega( ) 2.13 Sprawdzanie warunków Stosując instrukcje if, zdarza się czasami, iż warunek do sprawdzenia jest długi i skomplikowany. Zdarza się czasami, iż warunek zawiera odwołanie od funkcji, której obliczenia są czasochłonne. Warto wiedzieć, iż komputer sprawdza warunki od lewej strony do prawej. Można wtedy skorzystać z faktu, iż najpierw niech sprawdzi warunki, które sprawdza się szybko lub które często będą nieprawdziwe i stopniowo przechodzić do warunków bardziej czasochłonnych. Warto również spróbować najpierw uprościć wyrażenie, natomiast później zamieścić je w odpowiedniej kolejności. W tym przypadku funkcja Licz(arg) jest funkcją czasochłonną w obliczeniach. Nieoptymalnie: /*przykład 1*/ if(test1==true AND Licz(arg)==true OR test2==true) /*przykład 2*/ if(licz(arg))==true AND test2=false AND test1==true) Optymalnie: /*przykład 1*/ if(test2==true OR test1==true AND Licz(arg)==true) /*przykład 2*/ if(test2=false AND test1==true OR Licz(arg))==true)! 11 S trona

13 2.14 Zwiększenie skoku pętli Dla wielkich pętli, gdzie iterator przebiega od 0 do >10, warto zwiększyć skok pętli. Przy skoku równym 1 komputer sprawdzi 10 warunek zakończenia pętli. Warto wówczas zaoszczędzić ten czas i przeznaczyć go na coś efektywniejszego. Nieoptymalnie: for(unsigned long i=0;i< ;i++) { tab[i]=i; } Optymalnie: for(unsigned long i=0;i< ;i+=5) { tab[i]=i; tab[i+1]=i+1; tab[i+2]=i+2; tab[i+3]=i+3; tab[i+4]=i+4; } 2.15 Przekazywanie dużych danych Jeżeli jakaś funkcja posiada, jako argument strukturę, to nie opłaca się przekazywać całej struktury. Warto przekazywać argument, jako wskaźnik/referencje, która jest czasami znacznie lżejsza niż przekazanie całej struktury. struct moja { double a,b,c,d,e,f,g,h,i,j; }; Nieoptymalnie: void obliczenia(moja dane) Optymalnie: void obliczenia(moja &dane) 2.16 Konstrukcja wzajemnego wykluczania Warto zastępować konstrukcje if, konstrukcja if else if Chodzenie po tak stworzonej strukturze warunków jest znaczenie szybsze oraz nie zastają sprawdzane wielokrotnie warunki, które pośrednio zostały sprawdzone i są one nieprawdziwe. Nieoptymalnie: /*przykład 1*/ if(test1<10) {/*instrukcja1*/} if(test1>=10 AND test1<100) {/*instrukcja2*/} /*przykład 2*/ if(test1<10 AND test2<60) {/*instrukcja3*/} if(test1>=10 AND test1<100 AND test2<60) {/*instrukcja4*/} if(test1>=100 AND test1<200 AND test2>=60 AND test2<75) {/*instrukcja5*/} Optymalnie: /*przykład 1*/ if(test1<10) {/*instrukcja1*/} 12 S trona

14 else if(test1<100) {/*instrukcja2*/} /*przykład 2*/ if(test2<60){ if(test1<10) {/*instrukcja3*/} else if(test1<100) {/*instrukcja4*/} } else if(test2<75) if(test1>=100 AND test1<200) {/*instrukcja5*/} 2.17 Wartości leniwe Strategia wyznaczania wartości argumentów funkcji na żądanie. Podczas próby wykonywania obliczeń sprawdzamy czy już takie obliczenia były wykonane i czy wartości z tych obliczeń są aktualne. Jeżeli wynik obliczeń jest nieaktualny wracamy do obliczenia danych na nowo. Zazwyczaj uzyskiwanie tych informacji i przetrzymywanie wiąże się z niewielkim narzutem czasowym i pamięciowym Podsumowanie Zasad Efektywnego Programowania Zasady, które zostały przytoczone powyżej, nie wyczerpują po trosze tematu efektywnego programowania. Pokazują, w jaki sposób można rozpocząć efektywne programowanie, w kryterium czasu wykonywania kompilatu. Zasady te warto stosować i przetestować na dużych liczbach iteracji, aby całkowity uzysk czasowy był miły dla oka. Warto zwrócić szczególną uwagę na to, że programy składają się z pętli, które niekiedy z rzędem licznika milion. Warto wtedy zwrócić swoją uwagę na te pętle i skupić całą optymalizację w ich obrębie. Warto również rozważyć instrukcje warunkowe, czy warunki są w najprostszej postaci oraz czy nie następuje sprawdzanie warunku, który z góry będzie niespełniony. 13 S trona

15 3 Przełączniki wybranych kompilatorów Wybrane do testowania kompilatory posiadają 2 typy podstawowych przełączników optymalizacyjnych. Pierwszy typ odpowiada za wielkość kodu wynikowego, natomiast drugi typ odpowiada za szybkość działania kompilatu. W niniejszym rozdziale skupiono się na typem optymalizacyjnym względem czasu wykonywania kompilatu. Są cztery tego typu przełączników. Kompilatory również posiadają flagi optymalizacyjne, które można podzielić na: obliczeniowe, architektoniczne, precyzji, inne. Skupiono się na flagach obliczeniowych oraz architektonicznych, bowiem te flagi mają bezpośredni wpływ na optymalizację w wybranym kryterium. Flagi precyzji, są to flagi, które pozwalają na zmniejszenie precyzji obliczeń. Flagi te nie będą przedmiotem niniejszej pracy, bowiem praca dotyczy optymalizacji bez straty precyzji prowadzonych obliczeń. 3.1 Kompilator GCC -O0: Przełączniki typu O[x] Brak optymalizacji. Przełącznik domyślnie aktywny. -O1: Kompilator stara się zmniejszyć rozmiar kodu i czas realizacji, bez wykonywania żadnych optymalizacji, które mogą powodować problem przy uruchamianiu kompilatu na innym sprzęcie, lub mogące powodować zmianę struktury kodu. W zależności od jądra systemu, ten przełącznik włącza następujące flagi: -fauto-inc-dec, -fcprop-registers, -fdce, -fdefer-pop, -fdelayed-branch, -fdse, -fguess-branchprobability, -fif-conversion2, -fif-conversion, -fipa-pure-const, -fipa-reference, -fmergeconstants, -fshrink-wrap, -fsplit-wide-types, -ftree-builtin-call-dce, -ftree-ccp, -ftree-ch, -ftreecopyrename, -ftree-dce, -ftree-dominator-opts, -ftree-dse, -ftree-forwprop, -ftree-fre, -ftreephiprop, -ftree-sra, -ftree-pta, -ftree-ter, -funit-at-a-time. -O2: Kompilator stara się zwiększyć szybkość działania kodu wynikowego, dopasowując się do rodziny sprzętowej, jak analizując kod pod względem typowych przekształceń numerycznych i algorytmicznych. W zależności od jądra systemu, ten przełącznik włącza następujące dodatkowe względem przełącznika O1 flagi: -fthread-jumps, -falign-functions, -falign-jumps, -falign-loops, -falign-labels, -fcaller-saves crossjumping, -fcse-follow-jumps, -fcse-skip-blocks, -fdelete-null-pointer-checks, -fexpensiveoptimizations, -fgcse, -fgcse-lm, -finline-small-functions, -findirect-inlining, -fipa-sra, -foptimizesibling-calls, -fpeephole2, -fregmove -freorder-blocks, -freorder-functions, -frerun-cse-afterloop, -fsched-interblock, -fsched-spec, -fschedule-insns, -fschedule-insns2, -fstrict-aliasing, - fstrict-overflow, -ftree-if-to-switch-conversion, -ftree-switch-conversion, -ftree-pre -ftree-vrp. -O3: 14 S trona

16 Kompilator stara się zwiększyć szybkość działania kodu wynikowego, dopasowując się do konkretnej architektury system. Program taki może nie wykonać się na innej klasie jednostki obliczeniowej. W zależności od jądra systemu, ten przełącznik włącza następujące dodatkowe względem przełącznika O2 flagi: -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload, -ftreevectorize, -fipa-cp-clone options. Możliwości optymalizacyjnych, jakie oferuje kompilator GCC jest więcej, co za tym idzie, zaleca się przeczytanie dokumentacji kompilatora, w celu jak najlepszego dopasowania swojej optymalizacji do użytku programu Flagi optymalizacyjne Obliczeniowe Są to flagi kompilatora, które pozwalają dopasować się do konkretnych obliczeń, które wykonywane są w programie. Jeżeli wykonywane są obliczenia modulo dla pewnego pierścienia można przyspieszyć obliczenia ze względu na włączenia flagi, która przyspieszy takie obliczenia. W celu dopasowania specyficznych obliczeń do konkretnej flagi zaleca się zapoznanie z dokumentacją kompilatora. Przykładowe flagi, które zostały wybrane: -fipa-pure-const, -fipa-reference, -fmerge-constants, -fshrink-wrap, -fsplit-wide-types, -ftreebuiltin-call-dce, -ftree-copyrename, -ftree-dce, -ftree-dominator-opts, -ftree-dse, -ftreeforwprop, -ftree-fre, -ftree-phiprop, -ftree-sra, -ftree-pta, -ftree-ter, -funit-at-a-time, -fkeepinline-functions, -fkeep-static-consts, -fmerge-constants, -fmodulo-sched, -fgcse, -fdce, -fdse, - fexpensive-optimizations, -fipa-cp-clone, -fipa-matrix-reorg, -ftree-loop-linear, -floopinterchange, -floop-strip-mine, -floop-block, -ftree-loop-distribution, -ffast-math, -fassociativemath, -freciprocal-math, -funroll-all-loops, -fpeel-loops, Flagi optymalizacyjne Architekturalne Są to flagi kompilatora, które pozwalają dopasować się do kontentej maszyny liczącej, wykorzystując jej najlepsze cechy, rozkład rejestrów. Wykorzystują architekturę tak aby jak najlepiej dopasować się pod względem szybkości wykonywanych obliczeń. Przykładowe flagi, które zostały wybrane: -mmangle-cpu. -mcpu=cpu, -mcpu=name, -mtune=name, -march=name, -mfpu=name, - mfpe=number, -mfp=number, -mstructure-size-boundary=n, -mtp=name, -mcpu=cpu[- sirevision], -mmulticore. 3.2 Kompilatora ICC -O0: Przełączniki typu O[x] Wyłącza wszystkie optymalizacje. Przełącznik domyślnie aktywny. -O1: Kompilator poprzez ten przełącznik nie dopasowuje się do architektury maszyny. Kompilator próbuje optymalizować kod poprzez wykorzystanie ogólnodostępnych narzędzi komunikacji między poszczególnymi fragmentami kodu wynikowego. Przełącznik ten oferuje 15 S trona

17 najmniejszy stopień optymalizacji. W zależności od architektury maszyny, przełącznik ten może aktywować flagi, o których użytkownik może nie wiedzieć 1. -O2: Zalecany poziom optymalizacji. Przełącznik ten umożliwia lepsze dostosowanie się do rodziny sprzętowej, przez globalne zarządzanie rejestrami. Dopasowuje się również do optymalnego zarządzania wyjątkami, optymalizuje wybrany fragment kodu przez rozwinięcie pętli oraz zmianę warunków w pętli. Przełącznik ten może włącz inne flagi optymalizacyjne w celu zwiększenia prędkości działania kompilatu, jednak włączenie ich zależy od systemu i architektury, na jakiej kompilator działa. W celu zwiększenia działania swojego kodu, zalecane jest zapoznanie się z dokumentacją kompilatora z sekcją: Optymalizacja. -O3: Kompilator agresywniej podchodzi do kompilacji, stosując pewne techniki optymalizacyjne, przez co kompilat może być niestabilny. Kompilator próbuje bardziej dostosować się do architektury komputera, co może uniemożliwić działanie kodu na innej maszynie. Przełącznik ten aktywuje flaga, w zależności od parametrów technicznych maszyny, na której kompilator pracuje. Optymalizacja tym przełącznikiem jest niezalecana, w kryterium bardzo dokładnych obliczeń oraz mobilności kodu wynikowego. W celu zapoznania się z przełącznikiem, warto przeczytać dokumentacje kompilatora. Przełączników kompilatora ICC jest więcej. Głównie flagi, które są zawarte w dokumentacji kompilatora, mają za zadanie dopasowanie się do architektury firmy prowadzącej kompilator Flagi optymalizacyjne Obliczeniowe -fast, -fast-transcendentals, -fpie, -funroll-all-loops, -funsigned-bitfields, -parallel, -opt-matmul, - fmath-errno, -fp-model keyword, -fp-speculation=mode Flagi optymalizacyjne Architekturalne -auto-p32, -axcode, -fomit-frame-pointer. 1 Jeżeli kompilator odszuka sprzyjający sprzęt firmy Intel, kompilator aktywuje flagi związane z dostosowaniem się do rodziny jednostki obliczeniowej. 16 S trona

18 4 Wielowątkowość programów Wątek to jest twór systemowy, który wie, co ma zrobić i próbuje dostać od jednostki obliczeniowej trochę czasu na wykonanie powierzonego mu zadania. Wielowątkowość to cecha systemu operacyjnego, która umożliwia w ramach jednego procesu można wykonywać kilka wątków. Nowe wątki to kolejne instrukcje wykonywane oddzielnie, pochodzące z tego samego procesu, które współdzielą kod programu oraz dane. Wielowątkowość można odnieść do procesorów. W takim przypadku, wielowątkowość oznacza możliwość jednoczesnego wykonywania wielu wątków na pojedynczej jednostce obliczeniowej. W takim przypadku są to wątki sprzętowe, które zależą od liczby rdzeni procesora i wykonywane są równolegle. Cechą wielowątkowości jest to, iż wszystkie wątki wykonują się w ramach procesu głównego. Wielowątkowość została wprowadzona, w celu przetwarzania współbieżnego. Przetwarzanie współbieżne może przynieść zwiększenie wydajności programu, jednak mu istnieć ku temu odpowiednie zasoby sprzętowe. Wielowątkowość może również obniżyć wydajność, ponieważ potrzeba stworzyć wątek i go obsłużyć. Tworzenie jak i obsługa, np. synchronizacja wątków zabierają cenny czas procesora. Wszystkie wątki w obrębie jednego procesu współdzielą tę samą wirtualną przestrzeń adresową. Komunikacją między wątkami jest skonstruowana dosyć łatwo, bowiem wystarczy odwołać się do tych zmiennych współdzielonych. 17 S trona

19 5 OpenMP 5.1 Wstęp do OpenMP OpenMP jest to standard dla komputerów równoległych (SMP) dostarczony w postaci API dla programisty. Dostarcza mechanizmów korzystających w sposób jawny z wielowątkowości i pamięci współdzielonej w trybie równoległym. Standard bazuje na tworzeniu i usuwaniu wątków dla obszarów równoległych, które wykonują narzucone zadania przez programistę. Programista ma wpływ na liczbę tworzonych wątków i jakie główne zadanie ma zostać wykonanie przez grupę wątków. Programista natomiast nie ma wpływu, jakie wątki, co wykonają, tzn. programista nie przyporządkowuje konkretnemu wątkowi określonego zadania. Idea działania programu w standardzie OpenMP została ukazana na rysunku poniżej. Rysunek 1. Idea działania programu ze standardem OpenMP. Źródło: Zawsze startuje pojedynczy proces, który tworzy n wątków dla sekcji równoległej. po zakończeniu działania w tej sekcji następuje synchronizacja i porządkowanie. Wynikiem tego wątkiem, który zostaje jest wątek główny. Przechodząc do następnej sekcji równoległej, wątek główny tworzy n wątków, które wykonują zadanie w sekcji równoległej, po czym kończą działanie i wątek główny przechodzi dalej. Tworzenie sekcji równoległych opatrzone jest w kodzie źródłowym w postaci jawnej, odpowiednia dyrektywą preprocesora w postaci: #pragma omp nazwa_dyrektywy warunki nowa_linia_kodu Warto zaznaczyć, iż każda dyrektywa posiada jedną nazwę oraz każda dyrektywa dotyczy najbliższego następującego bloku kodu, czyli np. #pragma omp parallel shared(sum) private(i,arg) { //miejsce, w którym kodu nie powinno być //instrukcje sekcji równoległej } //koniec sekcji równoległej automatyczna synchronizacja i zarządzanie watkami 18 S trona

20 5.2 Pragmy w OpenMP Pragma paralel Aby potencjalnie wykorzystać równoległość obliczeń można zastosować pragme parallel. Po dyrektywnie parallell następuje bezpośrednio blok kodu z jednym wejściem i jednym wyjściem. Postać konstrukcji parallel jest następujące: #pragma omp parallel { //przetwarzanie równoległe } //przetwarzanie sekwencyjne Wykonanie konstrukcji parrallel jest następujące. Gdy wątek główny programu osiągnie miejsce określone przez dyrektywę parallel, wówczas tworzona jest grupa wątków. Grupa wątków stworzona jest pod warunkami, iż nie występuje klauzula if oraz jeśli występuje klauzula if ma ona wartość różna od zera. Gdy nie wystąpi taka sytuacja, wówczas blok kodu znajdujący się bezpośrednio pod dyrektywą parallel jest wykonywany przez wątek główny. Liczba wątków zależy od zmiennej OMP_NUM_THREADS Pragma for Warto również zapoznać się z pragmami określającymi dzielenie pracy. Najbardziej rozpoznawalną konstrukcją jest konstrukcja for. Konstrukcja for umożliwia dzielenie ciała pętli między wątki w grupie, przy czym każdy obrót pętli będzie wykonywany tylko raz. Konstrukcja ma postać: #pragma omp for for(...,...,...) { //ciało pętli for } Konstrukcja for wymaga, aby przed jej wykonaniem była znana liczba obrotów pętli Klauzula ordered Klauzula ordered umożliwia realizację wybranej części ciała pętli for w takim porządku, jakby pętla była wykonywana sekwencyjnie. #pragma omp for ordered for (i=0; i<32; i++) { // intensywne obliczenia #pragma omp ordered p r i n t f ( "Watek %d wykonuje:= %d\n",iam,i) ; } Klauzula schedule Klauzula schedule specyfikuje sposób podziału wykonań ciała pętli między wątki. Decyduje o tym parametr rodzaj, który może przybierać następujące wartości: static gdy przyjmuje postać schedule(static,rozmiar), wówczas pula obrotów jest dzielona na kawałki o wielkości rozmiar, które są cyklicznie przydzielane do wątków; gdy nie poda się rozmiaru, to pula obrotów jest dzielona na mniej więcej równe części; 19 S trona

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

Równoległość i współbieżność

Równoległość i współbieżność Równoległość i współbieżność Wykonanie sekwencyjne. Poszczególne akcje procesu są wykonywane jedna po drugiej. Dokładniej: kolejna akcja rozpoczyna się po całkowitym zakończeniu poprzedniej. Praca współbieżna

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Przetwarzanie Równoległe i Rozproszone

Przetwarzanie Równoległe i Rozproszone POLITECHNIKA KRAKOWSKA - WIEiK KATEDRA AUTOMATYKI I TECHNOLOGII INFORMACYJNYCH Przetwarzanie Równoległe i Rozproszone www.pk.edu.pl/~zk/prir_hp.html Wykładowca: dr inż. Zbigniew Kokosiński zk@pk.edu.pl

Bardziej szczegółowo

Podstawy Programowania C++

Podstawy Programowania C++ Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:

Bardziej szczegółowo

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java Cechy C++ Język ogólnego przeznaczenia Można programować obiektowo i strukturalnie Bardzo wysoka wydajność kodu wynikowego

Bardziej szczegółowo

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Temat 1: Podstawowe pojęcia: program, kompilacja, kod Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,

Bardziej szczegółowo

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij. Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice

Bardziej szczegółowo

Algorytm. a programowanie -

Algorytm. a programowanie - Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik

Bardziej szczegółowo

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI Wprowadzenie do środowiska Matlab 1. Podstawowe informacje Przedstawione poniżej informacje maja wprowadzić i zapoznać ze środowiskiem

Bardziej szczegółowo

Kompilator języka C na procesor 8051 RC51 implementacja

Kompilator języka C na procesor 8051 RC51 implementacja Kompilator języka C na procesor 8051 RC51 implementacja Implementowane typy danych bit 1 bit char lub char signed 8 bitów char unsigned 8 bitów int lub signed int 16 bitów unsigned int 16 bitów long lub

Bardziej szczegółowo

Język ludzki kod maszynowy

Język ludzki kod maszynowy Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu. Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą

Bardziej szczegółowo

2 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania

Bardziej szczegółowo

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Przykład 1. Napisz program, który dla podanej liczby n wypisze jej rozkład na czynniki pierwsze. Oblicz asymptotyczną złożoność

Bardziej szczegółowo

Podstawy Programowania Podstawowa składnia języka C++

Podstawy Programowania Podstawowa składnia języka C++ Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include

Bardziej szczegółowo

Zapisywanie algorytmów w języku programowania

Zapisywanie algorytmów w języku programowania Temat C5 Zapisywanie algorytmów w języku programowania Cele edukacyjne Zrozumienie, na czym polega programowanie. Poznanie sposobu zapisu algorytmu w postaci programu komputerowego. Zrozumienie, na czym

Bardziej szczegółowo

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie

Bardziej szczegółowo

Wstęp do Programowania, laboratorium 02

Wstęp do Programowania, laboratorium 02 Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite

Bardziej szczegółowo

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu inż. Daniel Solarz Wydział Fizyki i Informatyki Stosowanej AGH 1. Cel projektu. Celem projektu było napisanie wtyczki

Bardziej szczegółowo

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float

Bardziej szczegółowo

Język C zajęcia nr 11. Funkcje

Język C zajęcia nr 11. Funkcje Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji

Bardziej szczegółowo

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie

Bardziej szczegółowo

Podstawy programowania skrót z wykładów:

Podstawy programowania skrót z wykładów: Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace

Bardziej szczegółowo

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6 PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6 TEMAT: Programowanie w języku C/C++: instrukcje iteracyjne for, while, do while Ogólna postać instrukcji for for (wyr1; wyr2; wyr3) Instrukcja for twory pętlę działającą

Bardziej szczegółowo

Część 4 życie programu

Część 4 życie programu 1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część

Bardziej szczegółowo

Definicje. Algorytm to:

Definicje. Algorytm to: Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi

Bardziej szczegółowo

Języki i metodyka programowania. Wprowadzenie do języka C

Języki i metodyka programowania. Wprowadzenie do języka C Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia

Bardziej szczegółowo

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2014/15 Znajdowanie maksimum w zbiorze

Bardziej szczegółowo

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa). Algorytmy definicja, cechy, złożoność. Algorytmy napotykamy wszędzie, gdziekolwiek się zwrócimy. Rządzą one wieloma codziennymi czynnościami, jak np. wymiana przedziurawionej dętki, montowanie szafy z

Bardziej szczegółowo

Paradygmaty programowania

Paradygmaty programowania Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów

Bardziej szczegółowo

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja Pętle W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. Instrukcja for ma następującą postać: for (w1;w2;w3) instrukcja w1, w2, w3 są wyrażeniami Schemat blokowy

Bardziej szczegółowo

Programowanie strukturalne i obiektowe. Funkcje

Programowanie strukturalne i obiektowe. Funkcje Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy

Bardziej szczegółowo

ZASADY PROGRAMOWANIA KOMPUTERÓW

ZASADY PROGRAMOWANIA KOMPUTERÓW POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.

Bardziej szczegółowo

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; } Pętle Pętle (ang. loops), zwane też instrukcjami iteracyjnymi, stanowią podstawę prawie wszystkich algorytmów. Lwia część zadań wykonywanych przez programy komputerowe opiera się w całości lub częściowo

Bardziej szczegółowo

Programowanie w języku C++ Grażyna Koba

Programowanie w języku C++ Grażyna Koba Programowanie w języku C++ Grażyna Koba Kilka definicji: Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i zasad

Bardziej szczegółowo

do instrukcja while (wyrażenie);

do instrukcja while (wyrażenie); Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie

Bardziej szczegółowo

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje. Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using

Bardziej szczegółowo

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia Zmienna: [] [ '[' ']' ] ['=' ]; Zmienna to fragment pamięci o określonym

Bardziej szczegółowo

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności. Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle Krzysztof Banaś, Obliczenia wysokiej wydajności. 1 Organizacja pamięci Organizacja pamięci współczesnych systemów komputerowych

Bardziej szczegółowo

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII Spis treści Od autora..................................................... Obliczenia inżynierskie i naukowe.................................. X XII Ostrzeżenia...................................................XVII

Bardziej szczegółowo

Typy danych, zmienne i tablice. Tomasz Borzyszkowski

Typy danych, zmienne i tablice. Tomasz Borzyszkowski Typy danych, zmienne i tablice Tomasz Borzyszkowski Silne typy Javy Java jest językiem wyposażonym w silny system typów. Wywodzi się stąd siła i bezpieczeństwo tego języka. Co to znaczy silny system typów?

Bardziej szczegółowo

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++ Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++ Prezentacja jest współfinansowana przez Unię Europejską w ramach Europejskiego Funduszu Społecznego w projekcie pt. Innowacyjna dydaktyka

Bardziej szczegółowo

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych Krzysztof Banaś Obliczenia równoległe 1 Tworzenie programów równoległych W procesie tworzenia programów równoległych istnieją dwa kroki o zasadniczym znaczeniu: wykrycie

Bardziej szczegółowo

Języki programowania zasady ich tworzenia

Języki programowania zasady ich tworzenia Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1 Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1 Wprowadzenie Procesory graficzne GPU (Graphics Processing Units) stosowane są w kartach graficznych do przetwarzania grafiki komputerowej

Bardziej szczegółowo

Dr inż. hab. Siergiej Fialko, IF-PK,

Dr inż. hab. Siergiej Fialko, IF-PK, Dr inż. hab. Siergiej Fialko, IF-PK, http://torus.uck.pk.edu.pl/~fialko sfialko@riad.pk.edu.pl 1 Osobliwości przedmiotu W podanym kursie główna uwaga będzie przydzielona osobliwościom symulacji komputerowych

Bardziej szczegółowo

Przetwarzanie równoległe

Przetwarzanie równoległe Przetwarzanie równoległe Kostka równoległe przesyłanie i przetwarzanie Rafał Malinowski, Marek Musielak 1. Cel projektu: Celem projektu było stworzenie i przetestowanie oprogramowania działającego na serwerze

Bardziej szczegółowo

Język C - podstawowe informacje

Język C - podstawowe informacje Język C - podstawowe informacje Michał Rad AGH Laboratorium Maszyn Elektrycznych 2014-12-05 Outline Program w języku C Funkcje Składnia Instrukcje sterujace Na koniec... Po kolei napisać program (zwykły

Bardziej szczegółowo

Programowanie procesorów graficznych GPGPU

Programowanie procesorów graficznych GPGPU Programowanie procesorów graficznych GPGPU 1 GPGPU Historia: lata 80 te popularyzacja systemów i programów z graficznym interfejsem specjalistyczne układy do przetwarzania grafiki 2D lata 90 te standaryzacja

Bardziej szczegółowo

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami 1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.

Bardziej szczegółowo

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors. Wykład 3 ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors. Waldi Ravens J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 75 / 146 deklaracje zmiennych instrukcja podstawienia

Bardziej szczegółowo

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10. ZAMIANA LICZB MIĘDZY SYSTEMAMI DWÓJKOWYM I DZIESIĘTNYM Aby zamienić liczbę z systemu dwójkowego (binarnego) na dziesiętny (decymalny) należy najpierw przypomnieć sobie jak są tworzone liczby w ww systemach

Bardziej szczegółowo

ξ II.UWr Wprowadzenie do STM

ξ II.UWr Wprowadzenie do STM ξ KS @.UWr Wprowadzenie do STM Marek Materzok ZOSA 2007 ξ KS @.UWr Wprowadzenie Były sobie komputery. Wykonywały programy instrukcja po instrukcji i wszyscy byli szczęśliwi... ξ KS @.UWr Wprowadzenie Były

Bardziej szczegółowo

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k. Funkcje wymierne Jerzy Rutkowski Teoria Przypomnijmy, że przez R[x] oznaczamy zbiór wszystkich wielomianów zmiennej x i o współczynnikach rzeczywistych Definicja Funkcją wymierną jednej zmiennej nazywamy

Bardziej szczegółowo

Języki formalne i techniki translacji

Języki formalne i techniki translacji Języki formalne i techniki translacji Laboratorium - Projekt Termin oddania: ostatnie zajęcia przed 17 stycznia 2016 Wysłanie do wykładowcy: przed 23:59 28 stycznia 2016 Używając BISON-a i FLEX-a napisz

Bardziej szczegółowo

Wykład z Technologii Informacyjnych. Piotr Mika

Wykład z Technologii Informacyjnych. Piotr Mika Wykład z Technologii Informacyjnych Piotr Mika Uniwersalna forma graficznego zapisu algorytmów Schemat blokowy zbiór bloków, powiązanych ze sobą liniami zorientowanymi. Jest to rodzaj grafu, którego węzły

Bardziej szczegółowo

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,

Bardziej szczegółowo

Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm

Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm Wsparcie dla OpenMP w kompilatorze GNU GCC Krzysztof Lamorski Katedra Informatyki, PWSZ Chełm Streszczenie Tematem pracy jest standard OpenMP pozwalający na programowanie współbieŝne w systemach komputerowych

Bardziej szczegółowo

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy ALGORYTMY 1. Podstawowe definicje Algorytm (definicja nieformalna) to sposób postępowania (przepis) umożliwiający rozwiązanie określonego zadania (klasy zadań), podany w postaci skończonego zestawu czynności

Bardziej szczegółowo

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 1 Podstawy Wprowadzenie do programowania w języku C Kraków 2010 Twój pierwszy program w C Program w języku C, jak i w wielu innych językach

Bardziej szczegółowo

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku

Bardziej szczegółowo

Złożoność obliczeniowa zadania, zestaw 2

Złożoność obliczeniowa zadania, zestaw 2 Złożoność obliczeniowa zadania, zestaw 2 Określanie złożoności obliczeniowej algorytmów, obliczanie pesymistycznej i oczekiwanej złożoności obliczeniowej 1. Dana jest tablica jednowymiarowa A o rozmiarze

Bardziej szczegółowo

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby Część XI C++ W folderze nazwisko36 program za każdym razem sprawdza oba warunki co niepotrzebnie obciąża procesor. Ten problem można rozwiązać stosując instrukcje if...else Instrukcja if wykonuje polecenie

Bardziej szczegółowo

Podstawy Programowania Algorytmy i programowanie

Podstawy Programowania Algorytmy i programowanie Podstawy Programowania Algorytmy i programowanie Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Algorytm Algorytm w matematyce, informatyce, fizyce, itp. lub innej dziedzinie życia,

Bardziej szczegółowo

Przetwarzanie potokowe pipelining

Przetwarzanie potokowe pipelining Przetwarzanie potokowe pipelining (część A) Przypomnienie - implementacja jednocyklowa 4 Add Add PC Address memory ister # isters Address ister # ister # memory Wstęp W implementacjach prezentowanych tydzień

Bardziej szczegółowo

Język C, tablice i funkcje (laboratorium, EE1-DI)

Język C, tablice i funkcje (laboratorium, EE1-DI) Język C, tablice i funkcje (laboratorium, EE1-DI) Opracował: Tomasz Mączka (tmaczka@kia.prz.edu.pl) Wstęp (tablice) Tablica to uporządkowany ciąg elementów tego samego typu, zajmujących ciągły obszar pamięci.

Bardziej szczegółowo

Zaawansowane algorytmy i struktury danych

Zaawansowane algorytmy i struktury danych Zaawansowane algorytmy i struktury danych u dr Barbary Marszał-Paszek Opracowanie pytań praktycznych z egzaminów. Strona 1 z 12 Pytania praktyczne z kolokwium zaliczeniowego z 19 czerwca 2014 (studia dzienne)

Bardziej szczegółowo

Sieci obliczeniowe poprawny dobór i modelowanie

Sieci obliczeniowe poprawny dobór i modelowanie Sieci obliczeniowe poprawny dobór i modelowanie 1. Wstęp. Jednym z pierwszych, a zarazem najważniejszym krokiem podczas tworzenia symulacji CFD jest poprawne określenie rozdzielczości, wymiarów oraz ilości

Bardziej szczegółowo

Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP

Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP OpenMP p. 1/4 Wprowadzenie do zrównoleglania aplikacji z wykorzystaniem standardu OpenMP Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska OpenMP OpenMP

Bardziej szczegółowo

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,

Bardziej szczegółowo

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++ Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu

Bardziej szczegółowo

Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, , tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Rozwiązanie:

Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, , tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Rozwiązanie: Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, 6 11 6 11, tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Uprośćmy najpierw liczby dane w treści zadania: 8 2, 2 2 2 2 2 2 6 11 6 11 6 11 26 11 6 11

Bardziej szczegółowo

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy ALGORYTMY 1. Podstawowe definicje Algorytm (definicja nieformalna) to sposób postępowania (przepis) umożliwiający rozwiązanie określonego zadania (klasy zadań), podany w postaci skończonego zestawu czynności

Bardziej szczegółowo

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Załóżmy, że uprawiamy jogging i chcemy monitorować swoje postępy. W tym celu napiszemy program, który zlicza, ile czasu

Bardziej szczegółowo

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej Wykład I - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Zaliczenie przedmiotu Do zaliczenia przedmiotu niezbędne jest

Bardziej szczegółowo

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis i cz. 2 Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 i cz. 2 2 i cz. 2 3 Funkcje i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje instrukcje } i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje

Bardziej szczegółowo

Programowanie obiektowe i C++ dla matematyków

Programowanie obiektowe i C++ dla matematyków Programowanie obiektowe i C++ dla matematyków Bartosz Szreder szreder (at) mimuw... 04 X 2011 Wszelkie uwagi, poprawki, braki czy sugestie najlepiej wysyłać na maila. 1. wprowadzenie do Linuksa: kompilacja

Bardziej szczegółowo

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco 1. Liczby 3456.0012 i 0.000076235 w zapisie zmiennoprzecinkowym przedstawia się następująco a) 0.34560012 10 4 i 0.76235 10 4 b) 3.4560012 10 3 i 7.6235 10 5 c) 3.4560012 10 3 i 7.6235 10 5 d) po prostu

Bardziej szczegółowo

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga! Programowanie I O czym będziemy mówili Podstawy programowania w językach proceduralnym ANSI C obiektowym Java Uwaga! podobieństwa w podstawowej strukturze składniowej (zmienne, operatory, instrukcje sterujące...)

Bardziej szczegółowo

Pochodna i różniczka funkcji oraz jej zastosowanie do obliczania niepewności pomiarowych

Pochodna i różniczka funkcji oraz jej zastosowanie do obliczania niepewności pomiarowych Pochodna i różniczka unkcji oraz jej zastosowanie do obliczania niepewności pomiarowych Krzyszto Rębilas DEFINICJA POCHODNEJ Pochodna unkcji () w punkcie określona jest jako granica: lim 0 Oznaczamy ją

Bardziej szczegółowo

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji

Bardziej szczegółowo

I - Microsoft Visual Studio C++

I - Microsoft Visual Studio C++ I - Microsoft Visual Studio C++ 1. Nowy projekt z Menu wybieramy File -> New -> Projekt -> Win32 Console Application w okienku Name: podajemy nazwę projektu w polu Location: wybieramy miejsce zapisu i

Bardziej szczegółowo

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak Katedra Elektrotechniki Teoretycznej i Informatyki wykład 12 - sem.iii M. Czyżak Język C - preprocesor Preprocesor C i C++ (cpp) jest programem, który przetwarza tekst programu przed przekazaniem go kompilatorowi.

Bardziej szczegółowo

0 + 0 = 0, = 1, = 1, = 0.

0 + 0 = 0, = 1, = 1, = 0. 5 Kody liniowe Jak już wiemy, w celu przesłania zakodowanego tekstu dzielimy go na bloki i do każdego z bloków dodajemy tak zwane bity sprawdzające. Bity te są w ścisłej zależności z bitami informacyjnymi,

Bardziej szczegółowo

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1 Literatura 1. Wprowadzenie do obliczeń równoległych, Zbigniew Czech, Wydawnictwo Naukowe PWN, 2010, 2013 2. Introduction to Parallel Computing; Grama, Gupta, Karypis, Kumar; Addison Wesley 2003 3. Designing

Bardziej szczegółowo

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład I. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik Wykład I I Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Zaliczenie przedmiotu Na laboratorium można zdobyć 100 punktów. Do zaliczenia niezbędne jest

Bardziej szczegółowo

Wykład 1

Wykład 1 Wstęp do programowania 1 Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 1 Wprowadzenie Cel wykładów z programowania proceduralnego Wykład jest poświęcony językowi C i jego

Bardziej szczegółowo

Rekurencja (rekursja)

Rekurencja (rekursja) Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)

Bardziej szczegółowo

Wyklad 11 Języki programowania równoległego

Wyklad 11 Języki programowania równoległego Wyklad 11 Języki programowania równoległego Części wykładu: 1. Środowisko programu równoległego - procesy i wątki 2. Podstawowe problemy języków programowania równoległego 3. Języki programowania w środowisku

Bardziej szczegółowo

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu Literatura 1. Introduction to Parallel Computing; Grama, Gupta, Karypis, Kumar; Addison Wesley 2003 2. Wprowadzenie do obliczeń równoległych, Zbigniew Czech, Wydawnictwo Naukowe PWN, 2010. 3. Designing

Bardziej szczegółowo

Budowa Mikrokomputera

Budowa Mikrokomputera Budowa Mikrokomputera Wykład z Podstaw Informatyki dla I roku BO Piotr Mika Podstawowe elementy komputera Procesor Pamięć Magistrala (2/16) Płyta główna (ang. mainboard, motherboard) płyta drukowana komputera,

Bardziej szczegółowo

Microsoft IT Academy kurs programowania

Microsoft IT Academy kurs programowania Microsoft IT Academy kurs programowania Podstawy języka C# Maciej Hawryluk Język C# Język zarządzany (managed language) Kompilacja do języka pośredniego (Intermediate Language) Kompilacja do kodu maszynowego

Bardziej szczegółowo

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1 Przetwarzanie wielowątkowe przetwarzanie współbieżne Krzysztof Banaś Obliczenia równoległe 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe)

Bardziej szczegółowo

Programowanie strukturalne i obiektowe

Programowanie strukturalne i obiektowe Programowanie strukturalne i obiektowe Język C część I Opracował: Grzegorz Flesik Literatura: A. Majczak, Programowanie strukturalne i obiektowe, Helion, Gliwice 2010 P. Domka, M. Łokińska, Programowanie

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania Złożoność obliczeniowa, poprawność programów Paweł Daniluk Wydział Fizyki Jesień 2013 P. Daniluk(Wydział Fizyki) WP w. XII Jesień 2013 1 / 20 Złożoność obliczeniowa Problem Ile czasu

Bardziej szczegółowo