{"id":21879518,"url":"https://github.com/nerooc/mpi-cannon-algorithm","last_synced_at":"2025-03-22T00:17:04.770Z","repository":{"id":124517133,"uuid":"469938096","full_name":"nerooc/mpi-cannon-algorithm","owner":"nerooc","description":"Cannon's algorithm implemented in C with MPI","archived":false,"fork":false,"pushed_at":"2022-06-02T17:32:45.000Z","size":84,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-26T18:31:41.180Z","etag":null,"topics":["cannon","matrix-multiplication-parallel","mpi"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nerooc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-14T23:30:16.000Z","updated_at":"2022-06-14T15:28:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"7ea19919-f8bf-43a6-9e36-b6a47a668d0c","html_url":"https://github.com/nerooc/mpi-cannon-algorithm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fmpi-cannon-algorithm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fmpi-cannon-algorithm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fmpi-cannon-algorithm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nerooc%2Fmpi-cannon-algorithm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nerooc","download_url":"https://codeload.github.com/nerooc/mpi-cannon-algorithm/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244885696,"owners_count":20526296,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cannon","matrix-multiplication-parallel","mpi"],"created_at":"2024-11-28T08:17:00.048Z","updated_at":"2025-03-22T00:17:04.765Z","avatar_url":"https://github.com/nerooc.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"Gabriel Chęć, Tomasz Gajda\n# Mnożenie macierzy (MPI)\n### Algorytm Cannon'a \n\n## 1. Wstęp teoretyczny\nAlgorytm Cannon’a jest rozproszonym algorytmem mnożenia macierzy dla siatek dwuwymiarowych, który po raz pierwszy opisany został w 1969 r. przez Lynn’a Elliot’a Cannon’a.\n\n- Algorytm jest efektywny jedynie dla struktury kwadratowej,\n- Działających w algorytmie procesorów jest tyle jaki jest rozmiar macierzy.\n\n### Algorytm Cannon’a:\n\n1. Oznaczamy mnożone macierze jako A i B, macierz wynikową jako C, macierz procesów jako P.\n2. Proces P(i, j) początkowo przechowuje A(i, j), a B(i, j) oblicza blok C(i, j) macierzy wynikowej.\n3. Przekształcamy A i B w taki sposób, aby każdy proces mógł niezależnie rozpocząć mnożenie swoich lokalnych podmacierzy. \n4. Przesuwamy wszystkie podmacierze A(i, j) w lewo o i kroków i wszystkich podmacierzy B(i, j) w górę o j kroków.\n5. Wykonujemy mnożenie bloków lokalnych.\n6. Każdy blok A przesuwamy o jeden krok w lewo, a każdy blok B przesuwamy o jeden krok w górę.\n7. Wykonujemy mnożenie kolejnych bloków, dodajemy do wyniku częściowego i powtarzamy to, aż wszystkie bloki zostaną pomnożone.\n\n### Przykład obliczania jednego z elementów macierzy wynikowej\n\u003cimg width=\"731\" alt=\"Screenshot 2022-05-10 at 12 50 43\" src=\"https://user-images.githubusercontent.com/31045802/167612439-32d8979b-89a7-4d0d-9857-b9f89e1cd791.png\"\u003e\n\n## 2. Implementacja\nProgram został napisany w języku C. \nKorzystamy z jednej struktury danych o nazwie **matrix__data**. \n\n\nStruktura składa się z:\n- **mat** - spłaszczonej, jednowymiarowej tablicy elementów macierzy w postaci zmiennoprzecinkowej,\n- **row** - ilość rzędów macierzy,\n- **col** - ilość kolumn macierzy\n\n\nW programie możemy znaleźć 4 funkcje:\n- **main** - główna funkcja zajmująca się przebiegiem algorytmu, czyli obliczeniami i przekształceniami,\n- **print_matrix** - funkcja wypisująca macierz do konsoli w sposób sformatowany,\ninitialize_matrix - funkcja inicjalizująca macierz poprzez wczytanie jej z pliku .csv, zaalokowanie pamięci i zapisanie w postaci struktury matrix_data,\n- **save_matrix** - funkcja zapisująca macierz w postaci pliku .csv, używają\n\nProgram obsługuje flagę **-v (verbose)**. Po uruchomieniu programu z tą flagą możemy zobaczyć wypisane w sposób macierze mnożone oraz macierz wynikową.\n\n## 3. Uruchomienie\nDo przygotowania i uruchomienia rozwiązania służy plik makefile, w którym zdefiniowane są następujące komendy:\n\n- **build** - komenda kompiluje nasz program,\n- **build_valgrind** - j.w korzystając z valgrinda,\n- **nodes** - tworzy plik z węzłami,\n- **run** - uruchamia program korzystając z wielu komputerów,\n- **run_one** - uruchamia program na jednym komputerze,\n- **run_one_verb** - jw. z parametrem verbose,\n- **run_one_valgrind** - jw. korzystając z valgrinda,\n- **clean** - usuwa utworzone przy uruchamianiu pliki.\n\n\n## 4. Zawartość katalogu\n- **main.c** - program obsługujący zadanie,\n- **makefile** - plik make pozwalający na łatwe uruchamianie,  \n- **A.csv** - pierwsza mnożona macierz,\n- **B.csv** - druga mnożona macierz,\n- **Result.csv** - przykład docelowej wynikowej macierzy,\n- **Dokumentacja.pdf** - opis i dokumentacja projektu.\n\n## 5. Materiały\n- Prezentacja - [LINK](https://docs.google.com/presentation/d/129EjYHKPv4mQ-8vRnLUJHJYR8Tuz7tanogXzLdMU2go/edit#slide=id.g11bb28a1450_2_64)\n- GitHub - [LINK](https://github.com/nerooc/mpi-cannon-algorithm)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnerooc%2Fmpi-cannon-algorithm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnerooc%2Fmpi-cannon-algorithm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnerooc%2Fmpi-cannon-algorithm/lists"}