Przetwarzanie współbieżne |
---|
Wojciech Kupczyk 94415 |
Cele laboratorium:
przeprowadzenie pomiaru czasu CPU i zegarowego wykonania operacji
organizacja środowiska tworzenia oprogramowania w systemie Linux (make)
Zrealizowane zadania: 1-8 oraz zadania dodatkowe.
Zadanie polegało na napisaniu i uruchomieniu programu wykonującego operacje arytmetyczne (iloczyn skalarny wektorów) i zmierzeniu czasu tych operacji.
Do kompilacji użyto polecenia:
gcc –o program program.c pomiar_czasu.c
W celu uruchomienia użyto polecenia: ./program – obok zrzut ekranu.
Program skompilowany został również używając polecenia make. Uzupełniony kod pliku Makefile załączony jest poniżej.
# kompilator c CCOMP = gcc # konsolidator LOADER = gcc # opcje optymalizacji: # wersja do debugowania OPT = -g -DDEBUG # wersja zoptymalizowana do mierzenia czasu # OPT = -O3 # zaleznosci i komendy moj_program: moj_program.o pomiar_czasu.o $(LOADER) $(OPT) moj_program.o pomiar_czasu.o -o moj_program # Dopisana procedura # jak uzyskac plik moj_program.o ? moj_program.o: moj_program.c pomiar_czasu.h $(CCOMP) -c $(OPT) moj_program.c pomiar_czasu.o: pomiar_czasu.c pomiar_czasu.h $(CCOMP) -c $(OPT) pomiar_czasu.c |
---|
Zadania dodatkowe:
Zawartość archiwum pomiar_czasu.tgz została wypakowana do nowego katalogu: pomiar_czasu. Kompilujemy plik pomiar_czasu.c poleceniem: gcc –c pomiar_czasu.c w celu otrzymania pliku pomiar_czasu.o. Za pomocą polecenia ar rs libpomiar.a pomiar_czasu.o został utworzony plik biblioteczny libpomiar.a. Modyfikujemy Makefile oraz uruchamiamy program poleceniem make.
Kolejny uzupełniony kod pliku Makefile załączony jest poniżej.
# kompilator c CCOMP = gcc # konsolidator LOADER = gcc # opcje optymalizacji: # wersja do debugowania OPT = -g -DDEBUG # wersja zoptymalizowana do mierzenia czasu # OPT = -O3 # pliki naglowkowe INC = -I../pomiar_czasu # biblioteki LIB = -L../pomiar_czasu –lpomiar # zaleznosci i komendy moj_program: moj_program.o $(LOADER) $(OPT) moj_program.o -o moj_program $(LIB) # jak uzyskac plik moj_program.o ? moj_program.o: moj_program.c $(CCOMP) $(INC) -c $(OPT) moj_program.c clean: rm -f *.o |
---|
Poniżej załączam fragment kodu źródłowego wykonywanego programu:
int main() { srand(time(NULL)); inicjuj_czas(); //Otwarcie pliku do zapisu: FILE *fp; if ((fp=fopen("wynik.txt", "w"))==NULL) // otwarcie pliku do zapisu { printf ("Nie mogę otworzyć pliku wynik.txt do zapisu! \n"); exit(1); } // Dynamiczna alokacja pamięci: double *tab1, *tab2, tCPU, tClock, tCPUZapis, tClockZapis; size_t size = 1000000; tab1 = (double *)malloc(sizeof(double) * size); tab2 = (double *)malloc(sizeof(double) * size); if (!tab1 || !tab2) { perror("malloc"); return EXIT_FAILURE; } //Wypełnienie tablic: int i=0; for(i=0; i< (int)size; i++) { tab1[i] = rand()/(RAND_MAX + 1.0); tab2[i] = rand()/(RAND_MAX + 1.0); } // Mnożenie elementów tablic oraz pomiar czasu tej operacji: tCPU = czas_CPU(); tClock = czas_zegara(); double suma =0; for(i=0; i< (int)size; i++) { suma += tab1[i]*tab2[i]; } tCPU = czas_CPU() - tCPU; tClock = czas_zegara() - tClock; // Zapis do pliku oraz pomiar czasu tej operacji: tCPUZapis = czas_CPU(); tClockZapis = czas_zegara(); for(i=0; i< (int)size; i++) { fprintf (fp, "%lf", tab1[i]); fprintf (fp, "%s", "\t"); fprintf (fp, "%lf", tab2[i]); fprintf (fp, "%s", "\n"); } tCPUZapis = czas_CPU() - tCPUZapis; tClockZapis = czas_zegara() - tClockZapis; //Wyświetlenie wyników: wyswietl_wyniki(); return 0; |
---|