Jak cię złapią, to znaczy, że oszukiwałeś. Jak nie, to znaczy, że posłużyłeś się odpowiednią taktyką.
Wszystkie kroki zostaÅ‚y wykonane. Kod źródÅ‚owy w C oraz dwie wersje pliku Makefile zostaÅ‚y zaÅ‚Ä…czone poniżej. Główna część zadania sprowadzaÅ‚a siÄ™ do napisania, skompilowania oraz uruchomienia programu realizujÄ…cego operacjÄ™ iloczynu skalarnego dwóch wektorów wraz z pomiarem czasu tej operacji. Do kompilacji użyto polecenia: gcc –o mój_program mój_program.c pomiar_czasu.c W celu uruchomienia użyto polecenia: ./mój_program – powyżej wynik tej operacji. Program zostaÅ‚ także uruchomiony przy pomocy polecenia make. UzupeÅ‚niona struktura pliku Makefile zostaÅ‚a przedstawiona poniżej. Struktura pliku Makefile po uzupeÅ‚nieniu (dopisaniu procedury dla mój_program.o): # 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 -lm # zaleznosci i komendy moj_program: moj_program.o pomiar_czasu.o $(LOADER) $(OPT) moj_program.o pomiar_czasu.o -o moj_program $(LIB) # 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. Struktura pliku Makefile po modyfikacji (zaÅ‚Ä…czenie utworzonej biblioteki, procedura clean): # 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 Kod źródÅ‚owy w C: #include<stdlib.h> #include<stdio.h> #include<time.h> #include "pomiar_czasu.h" 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: printf("\t*** WYNIKI ***"); printf("Mnozenie"); printf("czas CPU = %lf\n",tCPU); printf("czas zegarowy = %lf\n",tClock); printf("\nZapis danych do pliku"); printf("czas CPU = %lf\n",tCPUZapis); printf("czas zegarowy = %lf\n",tClockZapis); return 0; }
|
WÄ…tki
|