Strona 1 z 1

pytanie/prośba/poszukuje

PostNapisane: 2010-06-24, 00:42:20
przez behemoth
Witajcie!
Zwracam się do Was z pytaniem, czy jest ktoś na szanownym forum, kto zna dobrze AWK?

PostNapisane: 2010-06-24, 08:35:00
przez BlueMan
thalcave w miarę dobrze zna AWK :)

PostNapisane: 2010-06-24, 09:33:56
przez junior
a co chcesz zrobić w awk... bo tego wbrew pozorom wcale nie trzeba dobrze znać bo jest w miarę proste.

PostNapisane: 2010-06-24, 11:03:41
przez behemoth
Operacja mnożenia macierzy dwóch macierzy ma tę własność, że każdy z elementów wynikowej macierzy C= A * B wyznacza się tylko na podstawie odpowiednich elementów macierzy A i B. Celem zadania jest napisanie programu obliczającego iloczyn dwóch macierzy w sposób rozproszony przy wykorzystaniu pamięci dzielonej.

Należy w języku C/C++ napisać program, który pozwoli pomnożyć dwie macierze określone na jego wejściu.

Działanie programu jest następujace: program otrzymuje jako parametr linii poleceń liczbę określającą za pomocą ilu procesów potomnych ma być zrealizowane mnożenie macierzy. Następnie ze standardowego wejścia odczytuje macierze do przemnożenia w następującej postaci:

pierwsza linia zawiera dwie liczby całkowite oddzielone spacjami określające rozmiary pierwszej macierzy
kolejne linie zawierają odpowiednią liczbę wierszy macierzy, przy czym każdy wiersz składa się z liczb zmiennoprzecinkowych oddzielonych spacjami
kolejne linie zawierają opis drugiej macierzy w postaci identycznej jak powyżej (tzn. najpierw wymiary, a następnie wartości)
Program powinien sprawdzić, czy dla wprowdzonych danych mnożenie macierzy jest wykonalne i jeśli nie, zakończyć swoje działanie z odpowiednim komunikatem i kodem błędu.

Następnie program inicjalizuje pamięć dzieloną i uruchamia wskazaną liczbę procesów potomnych (patrz funkcja fork(2)), które będą realizowały cząstkowe mnożenia. Schemat podziału (tzn. to które elementy mają być wyznaczane przez które procesy potomne) jest dowolny - powinien on zostać zaproponowany przez autora programu. Każdy z procesów potomnych oblicza odpowiednie elementy i umieszcza je we właściwym miejscu pamięci dzielonej. Po zakończeniu obliczeń proces potomny kończy się.

Działanie procesu głównego kończy się w momencie, kiedy wszystkie jego procesy potomne zakończyły swoje działanie - należy wówczas wypisać na standardowe wyjście macierz wynikową.

Pamięć dzielona jest efektywnym mechanizmem przekazywania danych między programami. Działanie tego mechanizmu komunikacji międzyprocesowej polega na tym, że program tworzy obszar pamięci, który jest dostępny dla innych programów. W zależności od ustawionych uprawnień programy mogą czytać lub modyfikować ten obszar pamięci. Do manipulacji pamięcią dzieloną służą funkcje shmget(2), shmat(2), shmdt(2), shmctl(2).

Po uruchomieniu proces główny tworzy stosowny obszar pamięci dzielonej i za jego pomocą udostępnia macierze wejściowe oraz przyjmuje efekty pracy procesów potomnych. W momencie kończenia pracy konieczne jest usunięcie wykorzystywanej pamięci dzielonej. Należy również zwrócić uwagę na fakt, że segmenty pamięci dzielonej identyfikowane są za pomocą kluczy (specjalnych identyfikatorów) i zarówno proces główny jak i procesy potomne muszą posługiwać się tym samym identyfikatorem.

PostNapisane: 2010-06-24, 11:48:58
przez junior
a co to ma do awk bo nie bardzo rozumiem?
AWK - interpretowany język programowania, którego główną funkcją jest wyszukiwanie i przetwarzanie wzorców. Jest także nazwą programu początkowo dostępnego dla systemów operacyjnych będących pochodnymi UNIX-a, obecnie także na inne platformy.

PostNapisane: 2010-06-24, 12:07:13
przez behemoth
Dokładnie takie zadanie mam zrealizować w połączeniu C++, basha i awk

PostNapisane: 2010-06-24, 18:08:08
przez junior
zrobić się da...
#!/bin/awk
BEGIN {
FS = " ";

}
{
if (NR == 1) {
w1= $1;
k1= $2;
} else if (NR <= (w1 +1)) {
for (i = 1; i <=k1; i++)
A[NR-1, i] = $i

} else if(NR == (w1 +2)) {
w2=$1;
k2=$2;
} else {
for (i = 1; i <= k2; i++)
B[NR-2-w1, i] = $i
}

}
END {
for(y=1; y<=w1; y++)
{
for(x=1; x<=k1; x++)
{
printf ("%f ",A[y,x]);
}
printf("\n");
}
for(y=1; y<=w2; y++)
{
for(x=1; x<=k2; x++)
{
printf ("%f ",B[y,x]);
}
printf("\n");
}
print k1;
print w1;
print podzial;
}

cat dane | awk -v podzial=4 -f skrypt.awk

mam zrobić wszystko za Ciebie czy sam powalczysz?

PostNapisane: 2010-06-24, 22:36:45
przez adams_a
Ja mam taką prośbę: mógłby ktoś to rozwiązać w C++ tak jak jest to napisane w treści zadania?

PostNapisane: 2010-07-02, 12:34:31
przez behemoth
Problem, zadanie, pomógł mi rozwiązać kolega z roku.
Junior, dzięki za zainteresowanie :)