Prowadzący zajęcia projektowe: Rafał Petryniak (strona domowa zajęć projektowych).
Spis treści
Pierwszą rzeczą jaką należy zrobić jest podpięcie klawiatury lub pada pod konsole. Następnie odpalamy konsole i wchodzimy do: „System Settings / Format Utility / Format HD / Custom /” tak jak na zdjęciu poniżej:
Następnie zaznaczamy opcje „ Allot 10GB to the PS3 System” i kliknij „Enter”
Następnie należy uruchomić ponownie komputer oraz włożyć dysk USB z bootowanym obrazem.
Później przechodzimy do „System Settings / Install Other OS”
W „ System Settings / Install other OS / Default Systems /” ustawić domyślny system jako „Other OS”.
Następnie klikamy na „yes” przy zapytaniu o zamkniecie systemu.
Można się później przełączyć się na system PS3 by pograć w gry :) , ale to będzie wymagało specjalnej komendy boot: „boot-game-os” (Fedora 6) lub „ps3-boot-game-os” (Fedora 9)
Przed instalacją należy przetestować media. Wciskamy "OK", albo jak mamy pewność, że płyta jest sprawna - wybieramy skip
Ładowanie instalatora, klikamy "Next"
Wybieramy język w którym ma pracować instalator. Można wybrać na tym etapie język polski, albo zmienić go później używająć locale w glibc. Klikamy "Next"
Wybieramy język klawiatury i oczywiście klikamy "Next". Sytuacja jak powyżej, aczkolwiek najlepiej ustawić polską klawiaturę na tym etapie.
Rozpoczynamy konfiguracje sieci, hostname , Gateway, Primary DNS, Secondary DNS
Sieć zostanie skonfigurowana później. Na tym etapie dobrze jest wyłączyć niepotrzebną w klastrze kartę wifi, oraz obsługę ipv6 na karcie eth0
Ustawiamy ip , maskę dla poszczególnych połączeń sieciowych, lub pomijamy tę część.
Wybieramy interesującą nas strefę czasową. Dla Polski jest to oczywiście Europe/Warsaw (+1 GMT)
Wprowadzamy hasło root'a. Należy pamiętać o polityce bezpieczeństwa. Hasło powinno zawierać co najmniej 8 znaków, w tym małe i wielkie litery, cyfry oraz znaki interpunkcyjne.
Wybieramy dysk do partycjonowania. Należy uważać, żeby nie zaznaczyć dysku USB jeśli takowy jest podłączony do konsoli.
Ustalamy odpowiednie rozmiary partycji wdg własnego uznania. Parametry dysku zasugerowane przez instalator są dość optymalne, dlatego można zaakceptować sugestię i przejść dalej.
Wybieramy interesujące nas pakiety. Należy odznaczyć wszelakie środowiska graficzne i niepotrzebne rzeczy. W sumie to, trzeba odznaczyć wszystko, poza base application, z którego to pakietu następnie odznaczamy niepotrzebne usługi typu sendmail.
Obserwujemy jak pięknie przebiega instalacja. Ponieważ proces ten trochę trwa, można w tym czasie pójść na pizzę albo pograć w gry, na jednej z oczekujących do instalacji konsol.
Podziwiamy screen z informacja o pomyślnie zakończonej instalacji. Klikamy "Reboot" i cieszymy się nowym systemem
Konsole zostały połączone w sieć zgonie z poniższym schematem:
Bezpośredni dostęp do konsol odbywa się poprzez przemapowane porty usługi ssh na komputerze głównym, który w tym przypadku jest komputerem NATującym.
W dystrbucji Fedora domyślną bramę oraz hostname ustawiamy w pliku network:
# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=m7ps301 GATEWAY=197.197.197.1
W tym pliku ustawiamy parametry kart sieciowych. Nam potrzebna będzie tylko karta eth0. Konfigurujemy kartę tak jak pokazano poniżej, pamiętając o ustawieniu adresu MAC swojej karty a także adresów sieciowych o ile są inne:
DEVICE=eth0 BOOTPROTO=static BROADCAST=197.197.197.255 ESSID= HWADDR=00:1F:A7:08:22:B9 IPADDR=197.197.197.101 NETMASK=255.255.255.0 NETWORK=197.197.197.0 ONBOOT=yes
Wskazujemy adresy IP naszych serwerów DNS:
#Dodanie trzech serwerów DNS: nameserver 149.156.153.2 nameserver 149.156.2.12 nameserver 149.156.132.100
Dopisujemy nazwy każdej konsoli, nie będzie już konieczne wpisywanie adresów IP w wewnętrznej sieci klastra.
127.0.0.1 localhost 197.197.197.1 xxx.yyy.pk.edu.pl 197.197.197.101 m7ps301 197.197.197.102 m7ps302 197.197.197.103 m7ps303 197.197.197.104 m7ps304 197.197.197.105 m7ps305 197.197.197.106 m7ps306 197.197.197.107 m7ps307 197.197.197.108 m7ps308 197.197.197.109 m7ps309 197.197.197.110 m7ps310 197.197.197.111 m7ps311 197.197.197.112 m7ps312 197.197.197.113 m7ps313 197.197.197.114 m7ps314 197.197.197.115 m7ps315 197.197.197.116 m7ps316
Konfigurujemy firewall'a korzystając z IPTABLES. Przykładowy plik rc.firewall jest zamiesczony poniżej. Należy pamiętać o przemapowaniu portów dla każdej konsoli jeśli chcemy mieć do nich dostęp z zewnątrz.
!/bin/sh PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" FWVER=0.07 LASTCHANGE="2009.03.20" echo -e "\nLoading rc.firewall - version $FWVER..\n" IPTABLES=/sbin/iptables MODPROBE=/sbin/modprobe EXTIF="eth0" echo " External Interface: $EXTIF" echo " ---" EXTIP="111.222.333.444" EXTIPNOMASK="111.222.333.444" echo " External IP: $EXTIP" echo " ---" INTIF="eth1" # Assign the internal TCP/IP network and IP address INTNET="197.197.197.0/24" INTIP="197.197.197.1/24" echo " LAN Interface: $INTIF" UNIVERSE="0.0.0.0/0" echo " Loading kernel modules.." echo " -ip_tables" echo " -ip_conntrack_ftp" echo " -ip_conntrack" echo " -ip_nat_ftp" echo " -iptable_nat" $MODPROBE ip_tables $MODPROBE ip_conntrack_ftp $MODPROBE ip_conntrack $MODPROBE ip_nat_ftp $MODPROBE iptable_nat echo " Enabling forwarding.." echo "1" > /proc/sys/net/ipv4/ip_forward #Load the IPTABLES filtering module - "iptable_filter" # - Loaded automatically when filter policies are activated echo " ---" echo " Clearing any existing rules and setting default policy to DROP.." $IPTABLES -P INPUT ACCEPT $IPTABLES -F INPUT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -F OUTPUT $IPTABLES -P FORWARD ACCEPT $IPTABLES -F FORWARD $IPTABLES -F -t nat echo " Delete all User-specified chains.." $IPTABLES -X echo " Reset all IPTABLES counters.." $IPTABLES -Z echo " loopback interfaces are valid.." ####################################################################### echo " Access input for ports: 22, 53" $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 22 -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 53 -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p udp --dport 53 -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p ICMP -s $UNIVERSE -d $EXTIP -j ACCEPT ####################################################################### $IPTABLES -t nat -A POSTROUTING -s $INTIP -o eth0 -j SNAT --to $EXTIP $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7001 -j DNAT --to-destination 197.197.197.101:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7002 -j DNAT --to-destination 197.197.197.102:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7003 -j DNAT --to-destination 197.197.197.103:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7004 -j DNAT --to-destination 197.197.197.104:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7005 -j DNAT --to-destination 197.197.197.105:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7006 -j DNAT --to-destination 197.197.197.106:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7007 -j DNAT --to-destination 197.197.197.107:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7008 -j DNAT --to-destination 197.197.197.108:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7009 -j DNAT --to-destination 197.197.197.109:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7010 -j DNAT --to-destination 197.197.197.110:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7011 -j DNAT --to-destination 197.197.197.111:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7012 -j DNAT --to-destination 197.197.197.112:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7013 -j DNAT --to-destination 197.197.197.113:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7014 -j DNAT --to-destination 197.197.197.114:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7015 -j DNAT --to-destination 197.197.197.115:22 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 7016 -j DNAT --to-destination 197.197.197.116:22 ####################################################################### # Infrates RMS 320 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 8123 -j DNAT --to-destination 197.197.197.222:23 $IPTABLES -t nat -A PREROUTING -p tcp -d $EXTIP --dport 8180 -j DNAT --to-destination 197.197.197.222:80
Nadanie praw wykonywalności firewalla:
# chmod 700 /etc/rc.d/rc.firewall
Uruchomienie:
# /etc/rc.d/rc.firewall
Restart Sieci:
# /etc/init.d/network restart
Wyłączenie przy instalacji
# setup - Firewall – Disable
Konfigurujemy plik rc.firewall. Należy pamiętać, aby otworzyć wewnątrz sieci klastra wysokie porty, wymagane przez demona orted przy rozpraszaniu procesów z użyciem openMPI. Przykładowy plik:
#!/bin/sh PATH="/sbin:/usr/sbin:/usr/local/sbin:$PATH" FWVER=0.01 echo -e "\nLoading rc.firewall - version $FWVER..\n" IPTABLES=/sbin/iptables MODPROBE=/sbin/modprobe EXTIF="eth0" echo " External Interface: $EXTIF" echo " ---" EXTIP="197.197.197.101" echo " External IP: $EXTIP" echo " ---" UNIVERSE="0.0.0.0/0" echo " Loading kernel modules.." echo " -ip_tables" echo " -ip_conntrack_ftp" echo " -ip_conntrack" $MODPROBE ip_tables $MODPROBE ip_conntrack_ftp $MODPROBE ip_conntrack #Load the IPTABLES filtering module - "iptable_filter" # - Loaded automatically when filter policies are activated echo " ---" echo " Clearing any existing rules and setting default policy to DROP.." $IPTABLES -P INPUT DROP $IPTABLES -F INPUT $IPTABLES -P OUTPUT DROP $IPTABLES -F OUTPUT $IPTABLES -P FORWARD DROP $IPTABLES -F FORWARD $IPTABLES -F -t nat echo " Delete all User-specified chains.." $IPTABLES -X echo " Reset all IPTABLES counters.." $IPTABLES -Z echo " loopback interfaces are valid.." echo " Creating a DROP chain.." $IPTABLES -N reject-and-log-it $IPTABLES -A reject-and-log-it -j LOG --log-level info $IPTABLES -A reject-and-log-it -j REJECT ###################################################################### echo -e "\n - Loading INPUT rulesets" ####################################################################### # INPUT: Incoming traffic from various interfaces. All rulesets are # already flushed and set to a default policy of DROP. # echo " loopback interfaces are valid" # $IPTABLES -A INPUT -i lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT echo " external interface, from any source, for ICMP traffic is valid" $IPTABLES -A INPUT -i $EXTIF -p ICMP -s $UNIVERSE -d $EXTIP -j ACCEPT echo " Allow any related traffic coming back to the MASQ server in" $IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state \ ESTABLISHED,RELATED -j ACCEPT echo " Access input for ports: 22, 53" $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 22 -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p tcp --dport 53 -j ACCEPT $IPTABLES -A INPUT -i $EXTIF -p udp --dport 53 -j ACCEPT echo "Update - acces to orted request by openMPI" $IPTABLES -A INPUT -t filter -p tcp --dport 20000:60000 -j ACCEPT ###################################################################### echo -e " - Loading OUTPUT rulesets" ####################################################################### # OUTPUT: Outgoing traffic from various interfaces. All rulesets are # already flushed and set to a default policy of DROP. # # Workaround bug in netfilter # See http://www.netfilter.org/security/2002-04-02-icmp-dnat.html # $IPTABLES -A OUTPUT -m state -p icmp --state INVALID -j DROP echo " loopback interface is valid" # $IPTABLES -A OUTPUT -o lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT echo " anything else outgoing on remote interface is valid" # $IPTABLES -A OUTPUT -o $EXTIF -s $EXTIP -d $UNIVERSE -j ACCEPT # ----- Begin OPTIONAL OUTPUT Section ----- # # Catch all rule, all other outgoing is denied and logged. # $IPTABLES -A OUTPUT -s $UNIVERSE -d $UNIVERSE -j reject-and-log-it ####################################################################### echo -e "\nrc.firewall $FWVER done.\n"
Nadanie praw wykonywalności firewalla:
# chmod 700 /etc/rc.d/rc.firewall
Uruchomienie:
# /etc/rc.d/rc.firewall
Restart Sieci:
# /etc/init.d/network restart
Należy stworzyć dowiązanie symboliczne /etc/localtime zgodnie z naszą strefą czasową. Poniżej przykład dla Polskiego czasu GMT+1
ZONE="Europe/Warsaw" # mv /etc/localtime /etc/localtime.old # ln -s /usr/share/zoneinfo/Poland /etc/localtime
Konfigurujemy demona ssh, pamiętając iż dobrze jest wyłączyć możliwość logowania się na superużytkownika i z innych nieproszonych kont. W poniższym przykładie zalogować może się tylko użytkownik m7ps3. Ponadto na wybranej przez nas konsoli włączamy forwardowanie X'ów, żeby umożliwić uruchamianie aplikacji graficznych.
Plik sshd_config: # $OpenBSD: sshd_config,v 1.77 2008/02/08 23:24:07 djm Exp $ # This is the sshd server system-wide configuration file. See # sshd_config(5) for more information. Port 22 #AddressFamily any ListenAddress 197.197.197.101 Protocol 2 SyslogFacility AUTHPRIV UsePAM yes X11Forwarding yes Subsystem sftp /usr/libexec/openssh/sftp-server #Extras AllowUsers m7ps3 PermitRootLogin no PermitEmptyPasswords no PasswordAuthentication yes ChallengeResponseAuthentication no # GSSAPI options GSSAPIAuthentication yes GSSAPICleanupCredentials yes UsePAM yes # Accept locale-related environment variables AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL
Teraz zmieniamy plik konfiguracyjny /etc/nsswitch.conf. Upewniamy się, że jedynym serwisem po publickey jest files ("publickey: files") i nic więcej. Jest to wymagane do wygodnej pracy z openMPI
# /etc/nsswitch.conf # # An example Name Service Switch config file. This file should be # sorted with the most-used services at the beginning. passwd: files shadow: files group: files hosts: files dns bootparams: files ethers: files netmasks: files networks: files protocols: files rpc: files services: files #netgroup: nisplus netgroup: files #publickey: nisplus publickey: files automount: files aliases: files
Tuningujemy lekko system ustawiając odpowiednie parametry jądra w pliku sysctl.conf. Na komputerze głównym należy zmienić net.ipv4.ip_forward z 0 na 1.
# Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # Controls IP packet forwarding net.ipv4.ip_forward = 0 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whether core dumps will append the PID to the core filename. # Useful for debugging multi-threaded applications. kernel.core_uses_pid = 1 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Others kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296
Przygotowywujemy ładny banner dla użytkowników, przestrzegając przy okazji o zagrożeniu płynącym z naruszania prawa i podając dane kontaktowe z administracją.
**** UWAGA **** Logujesz sie na serwer m7ps301 Dostep jedynie dla autoryzowanych uzytkownikow! Wszeklkie proby zlamania zasad uzytkowania serwera podlegaja karze na mocy K o d e k s u K a r n e g o RP, Rozdzial XXXIII Przestepstwa przeciwko ochronie informacji USTAWA z dnia 6 czerwca 1997 r. ze zm. EN: This computer system is for authorized users only. All activity is logged and regulary checked by systems personal. Individuals using this system without authority or in excess of their authority are subject to having all their services revoked. Any illegal services run by user or attempts to take down this server or its services will be reported to local law enforcement, and said user will be punished to the full extent of the law. Anyone using this system consents to these terms. Instytut Informatyki Stosowanej M-7 Wrazie zaistnialych problemow prosimy o kontakt tel.: (012) 628 36 55 --
W celu poprawy synchronizacji zegara systemowego użyliśmy protokołu NTP i zsynchronizowaliśmy czas z zegarem atomowym serwera ntp.task.gda.pl
NTP – protokół umożliwiający precyzyjną synchronizację czasu pomiędzy komputerami. Wzorcowy czas UTC może pochodzić bezpośrednio z zegarów atomowych lub pośrednio ze specjalizowanych serwerów czasu (ang. Time Server NTP). Protokół NTP jest coraz powszechniej uznawany za światowy standard synchronizacji czasu w urządzeniach teleinformatycznych i telekomunikacyjnych. Ma swoją implementację dla większości współczesnych systemów operacyjnych, z Microsoft Windows NT/2K/XP/2003/VISTA włącznie.
Implementacja protokołu NTP dla konkretnych systemów operacyjnych wymaga sprzęgnięcia na niskim poziomie jądra systemu operacyjnego. Czas lokalny tworzony jest przez system poprzez dodanie stosownego przesunięcia uwzględniającego lokalną strefę czasową. Dla systemów operacyjnych Linux i FreeBSD istnieją specjalne nakładki na jądro systemowe umożliwiające obsługę biegu zegarów ze zwiększoną precyzją. Nakładki umożliwiają płynną regulację czasu systemowego poprzez przyspieszenie lub spowolnienie programowego zegara systemowego.
Instalacja klienta NTP:
[root@m7-ps3a ~]# yum install rdate
Synchronizacja czasu
[root@m7-ps3a ~]# date nie, 24 maj 2009, 21:40:44 CEST [root@m7-ps3a ~]# rdate -s ntp.task.gda.pl [root@m7-ps3a ~]# date nie, 24 maj 2009, 23:43:59 CEST
Następnie należy dodać powyższą komendę do skryptów startowych. Zegar będzie synchronizowany przy każdym uruchomieniu konsoli:
[root@m7-ps3a ~]# echo "rdate -s ntp.task.gda.pl" >> /etc/rc.d/rc.local
Network File System (NFS) – oparty o UDP lub TCP protokół zdalnego udostępniania systemu plików.
NFS jest de facto standardowym sieciowym systemem plików na systemach Uniksowych. Inne protokoły udostępniające taką usługę, jak np. Coda, nie zyskały dużej popularności.
NFS został opracowany przez Sun Microsystems.
[root@m7-ps3a ~]# yum install nfs-utils
[root@m7-ps3a ~]# modprobe nfsd
[m7ps3@m7-ps3a ~]$ mkdir /home/m7ps3/pub
Następnie należy wyedytować plik /etc/exports dodając udostępniany katalog:
[root@m7-ps3a ~]# cat /etc/exports /home/m7ps3/pub 197.197.197.0/255.255.255.0(rw)
/home/m7ps3/pub - To folder, którego zawartość chcemy udostępnić.
197.197.197.0/255.255.255.0 - Tutaj podajemy adres IP komputera, który powinien mieć dostęp do naszego udostępnianego katalogu.
(rw) - rw jest skrótem od read/write, więc komputer, któremu udostępniamy zasób może dokonywać w nim zmian. Jeśli sobie tego nie życzymy, możemy zastosować atrybut tylko do odczytu - (ro).
Eskportujemy katalog:
[root@m7-ps3a ~]# exportfs -rv exporting 197.197.197.0/255.255.255.0:/home/m7ps3/pub [root@m7-ps3a ~]# chkconfig --level 0123456 nfs on [root@m7-ps3a ~]# /etc/init.d/nfs start
Do pliku /etc/fstab dodajemy nowy wpis:
197.197.197.1:/home/m7ps3/pub /home/m7ps3/pub nfs rw,intr,users 0 0
Tworzymy katalog w którym podmontujemy zdalny zasób:
[m7ps3@m7ps307 ~]$ mkdir /home/m7ps3/pub
Następnie podmontowywujemy utworzony folder:
mount /home/m7ps3/pub
Na koneic dopisujemy poniższą linię do pliku /etc/rc.d/rc.local w celu podmontowania katalogu przy starcie systemu spod użytkownika m7ps3:
su m7ps3 -c "mount /home/m7ps3/pub"
Avahi – wolna implementacja specyfikacji Zeroconf firmy Apple Inc., zawierająca system do wykrywania usług multicast DNS/DNS-SD. Avahi pozwala programom na publikowanie i wykrywanie usług i hostów w sieci lokalnej. Użytkownik może na przykład podłączyć laptopa do sieci i od razu wykryć drukarki, usługi typu FTP czy SSH a nawet osoby z którymi można porozmawiać. Cały program udostępniony jest na licencji LGPL.
Dzięki modularnej architekturze, Avahi jest zintegrowany z głównymi środowiskami graficznymi takimi jak GNOME i KDE.
Projekt Avahi został zapoczątkowany z powodu kontrowersyjnej licencji Apple, na której został opublikowany Bonjour. Od tego czasu Bonjour doczekał się zmiany licencji na mniej kontrowersyjną Apache License. Avahi stał się już jednak standardową implementacją mDNS/DNS-SD na wolnych systemach operacyjnych takich jak GNU/Linux czy FreeBSD.
Zero Configuration Networking (Zeroconfig), jest zestawem technik które automatycznie tworzą użyteczny adres IP bez dodatkowej konfiguracji czy specjalnych serwerów.
Dzięki temu przeciętny użytkownik może łączyć komputery, drukarki sieciowe i inne urządzenia sieciowe. Bez Zeroconfig użytkownik musi zainstalować i skonfigurować specjalne usługi jak DHCP i DNS, lub ręcznie ustawiać wymagane dane na każdym komputerze, co może być trudne i czasochłonne, szczególnie dla osoby nie technicznej.
Klaster NIE JEST konfigurowany automatycznie, tylko na sztywno, często z uwględnieniem zaawansowanych opcji. Należy wyrzucić avahi ze skryptów startowych, a dla bezpieczeństwa usunąć też skrypt z init.d.
[root@m7-ps3a ~]# chkconfig --del avahi-daemon [root@m7-ps3a ~]# rm /etc/init.d/avahi-daemon
W systemie operacyjnym fedora uruchamiane przy starcie usługi możemy sprawdzić za pomocą polecenia chkconfig:
[root@m7-ps3a ~]# chkconfig --list |grep włączone NetworkManager 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone atd 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone crond 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone cups 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone gpm 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:wyłączone 6:wyłączone haldaemon 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone ip6tables 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone iprdump 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone iprinit 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone iprupdate 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone iptables 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone irqbalance 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone mdmonitor 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone messagebus 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone netfs 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone network 0:włączone 1:włączone 2:włączone 3:włączone 4:włączone 5:włączone 6:włączone nfs 0:włączone 1:włączone 2:włączone 3:włączone 4:włączone 5:włączone 6:włączone nfslock 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone pcscd 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone restorecond 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone rpcbind 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone rpcgssd 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone rpcidmapd 0:wyłączone 1:wyłączone 2:wyłączone 3:włączone 4:włączone 5:włączone 6:wyłączone rsyslog 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone sendmail 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone sshd 0:włączone 1:włączone 2:włączone 3:włączone 4:włączone 5:włączone 6:włączone udev-post 0:wyłączone 1:włączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone wpa_supplicant 0:wyłączone 1:wyłączone 2:włączone 3:włączone 4:włączone 5:włączone 6:wyłączone
Niektóre usługi nie są potrzebne do działania klastra. Bezczynnie działające w tle obniżają bezpieczeństwo systemu i należy je wyłączyć. Poniżej przedstawiony jest opis kilku najpopularniejszych.
NetworkManager jest narzędziem mającym na celu uproszczenie korzystania z sieci komputerowych na Linuksie i innych uniksopodobnych systemów operacyjnych. Projekt został zainicjowany w 2004 r. przez Red Hat, w celu umożliwienia użytkownikom Linuksa łatwiejszej obsługi urządzeń nowoczesnej sieci, zwłaszcza sieci bezprzewodowej.
Ponieważ na klastrze sieć została skonfigurowana na sztywno, a sieć wifi jest wyłączona nie ma potrzeby stosowania w/w demona. Przy takich ustawieniach sieciowych network manager narobiłby więcej szkód niż pożytku. Należy wyłączyć.
Cups jest nowoczesnym i uniwersalnym systemem druku dla systemów uniksowych. Może być stosowany zarówno do drukowania lokalnego jak i do drukowania w sieci - obsługuje domyślnie protokół IPP. Po poprawnym skonfigurowaniu urządzenia będziemy mogli drukować z niemal każdego programu, CUPS akceptuje wywołania poleceń drukowania w stylu klasycznego systemu LPD
Klaster nie ma podłączonych drukarek. Należy wyłączyć.
Gpm jest programem, który pozwala używac myszy w konsoli. Jest on zazwyczaj dołączany do dystrybucji Linux-owych i można go uruchomiæ z linii poleceñ lub w skrypcie startowym /etc/rc.d/rc.local. gpm stanowi problem dla ludzi używających myszy typu bus, ponieważ blokuje mysz i powoduje, że X-y nie mogą jej używać - ci z nas którzy używają myszy szeregowych nie mają tego problemu.
Na klaster użytkownicy logują się zdalnie, więc demon do obsługi myszki na konsoli nie jest potrzebny. Należy wyłączyć.
Ip6tables jest używany do tworzenia, utrzymywania i kontroli reguł filtrowania pakietów IPV6 w jądrze Linuksa. Pozwala na użycie kilku różnych tabel. Każda tabela zawiera szereg wbudowanych łańcuchów i może zawierać również własne, zdefiniowane przez użytkownika sieci.
Sendmail jest popularnym serwerem poczty (MTA), rozwijanym od 1979. Autorem pierwszej wersji sendmaila jest Eric Allman, który napisał również jego poprzednika - delivermaila. Oprócz SMTP sendmail oferuje wiele sposobów przesyłania i dostarczania poczty. Jest najpopularniejszym MTA w internecie, co częściowo wynika z tego, że jest standardowym programem tego typu w wielu systemach typu Unix. Jest rozpowszechniany zarówno jako wolne oprogramowanie jak i na licencjach zamkniętych.
Zadaniem klastra nie jest udostępnianie użytkownikom serwera pocztowego. Należy wyłączyć.
WPA Supplicant to pakiet, który pozwala połączyć się do punktów dostępowych z włączonym WPA. Jego ustawienia są dość płynne, ponieważ jest jeszcze w fazie beta - mimo to, działa całkiem dobrze.
Klaster ma wyłączoną obsługę karty sieciowej wifi, tak więc w/w demon jest zbędny w systemie.
Wyłączenie wymienionych usług:
[root@m7-ps3a ~]# chkconfig --del wpa_supplicant [root@m7-ps3a ~]# chkconfig --del sendmail [root@m7-ps3a ~]# chkconfig --del ip6tables [root@m7-ps3a ~]# chkconfig --del NetworkManager [root@m7-ps3a ~]# chkconfig --del cups [root@m7-ps3a ~]# chkconfig --del gpm
Linux Fedora po instalacji domyślnie ładuje moduły karty dźwiękowej, gdy tylko taka znajduje się w komputerze. Ponieważ nie będzie używana na klastrze najlepiej ją wyłączyć.
[root@m7ps312 ~]# lsmod |grep snd snd_ps3 33208 0 snd_seq_dummy 21972 0 snd_seq_oss 72640 0 snd_seq_midi_event 26264 1 snd_seq_oss snd_seq 104888 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event snd_seq_device 27536 3 snd_seq_dummy,snd_seq_oss,snd_seq snd_pcm_oss 84104 0 snd_mixer_oss 41232 1 snd_pcm_oss snd_pcm 139900 2 snd_ps3,snd_pcm_oss snd_page_alloc 29536 1 snd_pcm snd_timer 49676 2 snd_seq,snd_pcm snd 111504 9 snd_ps3,snd_seq_dummy,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer soundcore 26056 1 snd
Wyłączenie modułów dźwięku i dopisanie ich do blacklist:
[root@m7ps312 ~]# echo "blacklist snd" >> /etc/modprobe.d/blacklist [root@m7ps312 ~]# echo "blacklist soundcore" >> /etc/modprobe.d/blacklist [root@m7ps312 ~]# rmmod snd_seq_oss [root@m7ps312 ~]# rmmod snd_seq_dummy [root@m7ps312 ~]# rmmod snd_seq_midi_event [root@m7ps312 ~]# rmmod snd_seq [root@m7ps312 ~]# rmmod snd_pcm_oss [root@m7ps312 ~]# rmmod snd_ps3 [root@m7ps312 ~]# rmmod snd_seq_device [root@m7ps312 ~]# rmmod snd_mixer_oss [root@m7ps312 ~]# rmmod snd_pcm [root@m7ps312 ~]# rmmod snd_timer [root@m7ps312 ~]# rmmod snd [root@m7ps312 ~]# rmmod snd_page_alloc [root@m7ps312 ~]# rmmod soundcore
Tworzymy plik wylacz_dzwiek.sh zawierający powyższe komendy wyrzucania modułów dźwięku (w identycznej kolejności) i zapisujemy go w /usr/local/sbin z atrybutem +x
Następnie dopisujemy wykonywanie skryptu przy starcie systemu:
[root@m7ps312 ~] echo "/usr/local/sbin/wylacz_dzwiek.sh >> /etc/rc.d/rc.local"
OpenMPI (skr. Ang. Open Multi-Processing) - jest interfejsem do wątków POSIX Threads (Portable Operating System Interface), w skrócie zwanych Pthreads. Pthreads to standard programowania wielowątkowego, obecnie bardzo często używany i najbardziej rozpowszechniony. Jest to jednak programowanie równoległe na niskim poziomie, gdzie programista dba o tworzenie wątków, ich synchronizację i zniszczenie.
Środowisko OpenMP powstało we wczesnych latach 90-tych, początkowo dla języka Fortran, później dla języków C i C++. Głównym celem przedsięwzięcia było umożliwienie automatycznego zrównoleglania kodu. Nad rozwojem specyfikacji OpenMP czuwa OpenMP Architecture Review Board, zrzeszające korporacje zainteresowane tym standardem.
OpenMPI nie jest pierwszą inicjatywną zmierzająca do utworzenia środowiska do automatycznego zrównoleglania kodu. Cechą wyróżniającą OpenMP spośród innych inicjatyw jest fakt ukończenia specyfikacji wymagań (do tej pory powstały wersje 2.0, zarówno dla języka Fortran, jak i dla języka C i C++) oraz przede wszystkim szerokie wsparcie ze strony korporacji. Wsparcie to pochodzi zarówno od producentów sprzętu, jak i twórców oprogramowania. Do stworzenia OpenMP Architecture Review Board należą m.in. firmy Compaq, Hawlett-Packard, Intel, IBM, Silicion Graphic, Sun Microsystems. OpenMP nie jest do tej pory standardem formalnym, a jedynie korporacyjnym.
MPICH - ogólnodostępna, darmowa i przenośna implementacja standardu MPI. Pozwala na przekazywanie komunikatów pomiędzy aplikacjami działającymi równolegle. Nadaje się do stosowania na małych klastrach. Najnowszą wersję biblioteki MPICH można pobrać ze strony domowej projektu. Biblioteki MPICH można używać zarówno na systemach klasy MS Windows jak i Unix.
Obecna wersją 1.0.8 jest MPICH2, wydany w dniu 24 października 2008. MPICH2 zastępuje MPICH1 i powinien być stosowany zamiast MPICH1 wyjątkiem przypadku klastrów z niejednorodną reprezentacją danych. MPICH 2 nie obsługuje jeszcze tych systemów (wsparcie jest planowane na 2009).
Powstała także wersja tej biblioteki o nazwie MPICH-G2 pozwalająca uruchamiać aplikacje równoległe w środowiskach gridowych, z wykorzystaniem pakietu Globus Toolkit jako warstwy pośredniej. Dzięki temu rozwiązaniu aplikacja może działać na kilku klastrach rozproszonych geograficznie.
Dlaczego OpenMPI ?
Po zaczerpnięciu informacji oraz opinii na temat obu środowisk zdecydowaliśmy się na OpenMPI. OpenMPI jest nowym, ale już od kilku lat dość mocno rozwijanym środowiskiem programowania maszyny typy shered-memory. Prostota jego użycia umożliwia zastosowanie go przez osoby nie mające dużego doświadczenia w programowanie równoległym, dla których napisanie programu to tylko drobny element umożliwiający im pracę naukową w zupełnie innej dziedzinie, takiej jak fizyka, chemia czy medycyna. Programowanie w środowisku OpenMPI jest bardzo proste, ponieważ oparte jest na posługiwaniu się dyrektywami kompilatora, kilkoma stałymi systemowymi i funkcjami. Proces zrównoleglenia wykonywany jest automatycznie, programista jedynie wskazuje miejsca, które należy zrównoleglić.
Wsparcie największych producentów sprzętu i oprogramowania miało niewątpliwie duży wpływ na nasz wybór gdyż gwarantuje środowisku OpenMPI ciągły rozwój i udoskonalanie. Wpłynęło ono także na rosnącą dostępność kompilatorów i narzędzi do debuggowania.
Środowisko OpenMPI nie jest oczywiście wolne od wad. Prostota programowania wpłynęła negatywnie na prędkości obliczeń. Dla małych problemów OpenMPI działa nawet trochę szybciej niż MPICH2, jednak dla obliczeń wielkiej skali górę bierze MPICH2 (obecna wersja OpenMPI nie gwarantuje optymalnego wykorzystania pamięci). Ponadto , w związku z tym, że OpenMPI jest tylko interfejsem (najczęściej do Pthreads) jego możliwości są ograniczone do tych które są zaimplementowane w bibliotece. Jeśli więc dostawca biblioteki nie zaimplementuje jakiejś funkcjonalności ujętej w specyfikacji, funkcjonalność ta nie może być wykorzystana, w programie. Z powodu tych ograniczeń, a także z powodu większych wymagań dotyczących np. struktury wątków, OpenMPI nie jest wystarczającym środowiskiem do oprogramowania bardziej złożonych problemów. Mimo tych kilku wad OpenMPI dalej jest dla nas ciekawszą produkcją niż MPICH2 gdyż posiada cechy na których nam najbardziej zależy (prostota oprogramowania i ogromne wsparcie producentów).
Na wstępie najlepiej rozwiązać zależności - aplikacja torque, o ile jeszcze nie są zainstalowane w systemie:
[root@m7-ps3a ~]# yum libtorque torque Ustawianie procesu instalacji Analizowanie argumentów instalacji pakietów Pakiet libtorque-2.1.10-5.fc9.ppc jest już zainstalowany w najnowszej wersji Pakiet torque-2.1.10-5.fc9.ppc jest już zainstalowany w najnowszej wersji Nie ma niczego do zrobienia
Następnie przejść do instalacji OpenMPI. Zainstalowane zostaną 3 pakiety. Główny MPI, Biblioteki do niego, oraz narzędzia developerskie (mpicc, itd) z pakietu openmpi-devel.
[root@m7-ps3a ~]# yum install openmpi openmpi-libs openmpi-devel Ustawianie procesu instalacji Analizowanie argumentów instalacji pakietów Rozwiązywanie zależności --> Wykonywanie sprawdzania transakcji ---> Pakiet openmpi.ppc 0:1.2.4-2.fc9 zostanie zaktualizowany ---> Pakiet openmpi-libs.ppc 0:1.2.4-2.fc9 zostanie zaktualizowany ---> Pakiet openmpi-devel.ppc 0:1.2.4-2.fc9 zostanie zaktualizowany --> Zakończono rozwiązywanie zależności Rozwiązano zależności ============================================================================= Pakiet Architektura Wersja Repozytorium Rozmiar ============================================================================= Instalowanie: openmpi ppc 1.2.4-2.fc9 fedora 133 k openmpi-devel ppc 1.2.4-2.fc9 fedora 284 k openmpi-libs ppc 1.2.4-2.fc9 fedora 1.2 M Podsumowanie transakcji ============================================================================= Instalowanie 3 pakietów Aktualizowanie 0 pakietów Usuwanie 0 pakietów Całkowity rozmiar pobierania: 1.6 M W porządku? [t/N]:
Ustawienia węzłów i liczby rdzeni na poszczególnych maszynach które będą dostępne z poziomu MPI
[m7ps3@m7-ps3a ~]$ cat /etc/openmpi-default-hostfile # This is the default hostfile for Open MPI. Notice that it does not # contain any hosts (not even localhost). This file should only # contain hosts if a system administrator wants users to always have # the same set of default hosts, and is not using a batch scheduler # (such as SLURM, PBS, etc.). 197.197.197.1 197.197.197.101 slots=2 197.197.197.102 slots=2 197.197.197.103 slots=2 197.197.197.104 slots=2 197.197.197.105 slots=2 197.197.197.106 slots=2 197.197.197.107 slots=2 197.197.197.108 slots=2 197.197.197.109 slots=2 197.197.197.110 slots=2 197.197.197.111 slots=2 197.197.197.112 slots=2 197.197.197.113 slots=2 197.197.197.114 slots=2 197.197.197.115 slots=2 197.197.197.116 slots=2
Wpisywanie hasła przy każdym połączeniu przez SSH lub próbie skopiowania pliku może być denerwujące. Z drugiej strony całkowity brak zabezpieczenia przed nieuprawnionym dostępem jest oczywistą dziurą w bezpieczeństwie i na to również nie możemy sobie pozwolić. Rozwiązaniem takiego problemu jest uwierzytelnianie za pomocą kluczy - publicznego i prywatnego.
Dodatkowo sprawa komplikuje się gdy chcemy skorzystać ze zrównoleglenia aplikacji poprzez MPI. Będziemy proszeni o podanie hasła do użytkownika m7ps3 przy każdej próbie połączenia się z każdą konsolą.
Żeby uniknąć tego typu problemów generujemy parę kluczy publiczny-prywatny i umieszczamy klucz publiczny z komputera zarządzającego (a także w naszej konfiguracji klastra - węzła siódmego i ósmego) na każdej z konsol
Zestaw kluczy generujemy lokalnie poleceniem ssh-keygen. Poniżej przykładowy efekt działania komendy generującej klucz asymetryczny typu RSA lub DSA:
[m7ps3@m7-ps3a ~]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/m7ps3/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/m7ps3/.ssh/id_rsa. Your public key has been saved in /home/m7ps3/.ssh/id_rsa.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Przy pytaniu o hasło należy wcisnąć ENTER - utworzony zostanie klucz bezhasłowy. Po wykonaniu tego polecenia, wygenerowane zostały dwa klucze. Klucz prywatny został zapisany w pliku /home/użytkownik/.ssh/id_rsa i nie powinniśmy go udostępniać nikomu. Drugi klucz, publiczny, pojawił się w pliku /home/użytkownik/.ssh/id_rsa.pub i ten klucz będziemy mogli pokazać całemu światu.
Abyśmy z naszego lokalnego komputera mogli logować się bez hasła (a jedynie z użyciem klucza) na zdalny serwer musimy już tylko dodać wpis o naszym kluczu publicznym do pliku authorized_keys znajdującego się w katalogu ~/.ssh na serwerze zdalnym. Aby to zrobić, wystarczy wykonać poniższe polecenia:
scp /home/m7ps3/.ssh/id_rsa.pub m7ps3@197.197.197.107:~/ ssh m7ps3@197.197.197.107 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys rm ~/id_rsa.pub
Trzecie z tych poleceń wykonujemy już oczywiście na zdalnym serwerze. Po tej operacji wszelkie akcje wykonywane na zdalnym serwerze za pośrednictwem SSH nie będą wymagały uwierzytelniania z użyciem hasła, co na pewno znacznie ułatwi nam pracę.
Aby umożliwiać pełne wykorzystanie potencjału architektury Cell/B.E. i procesora PowerXCell 8i, firma IBM opracowała pakiet programistyczny, który przyspiesza tworzenie rozwiązań gotowych do wdrożenia, korzystających z mocy obliczeniowej procesora wielordzeniowego.
IBM Software Development Kit (SDK) zawiera biblioteki, narzędzia i zasoby potrzebne do tworzenia i dostrajania aplikacji dla platformy Cell/B.E. Jego zastosowania i zalety to między innymi:
* Szybkie przenoszenie i optymalizowanie aplikacji oraz algorytmów.
* Zwiększenie produktywności pracy programistów i ułatwienie programowania.
* Niezawodność narzędzia programistycznego objętego gwarancją i wsparciem.
* Biblioteki opracowane przez niezależnych producentów pozwalające na integrację i budowanie własnego ekosystemu oprogramowania.
Na wstępie najlepiej rozwiązać zależności - aplikacja torque, o ile jeszcze nie są zainstalowane w systemie, oraz upewnić się, czy są zainstalowane paczki glibc, tcl i nagłówki jądra:
[root@m7-ps3a ~]# yum install tcl glibc-headers glibc-devel.ppc64 glibc.ppc64 glibc-devel glibc kernel-headers Ustawianie procesu instalacji Analizowanie argumentów instalacji pakietów Pakiet glibc-2.8-3.ppc64 jest już zainstalowany w najnowszej wersji Rozwiązywanie zależności --> Wykonywanie sprawdzania transakcji ---> Pakiet tcl.ppc 1:8.5.1-4.fc9 zostanie zaktualizowany ---> Pakiet glibc-headers.ppc 0:2.8-3 zostanie zaktualizowany ---> Pakiet glibc-devel.ppc64 0:2.8-3 zostanie zaktualizowany ---> Pakiet kernel-headers.ppc 0:2.6.25-14.fc9 zostanie zaktualizowany --> Zakończono rozwiązywanie zależności Rozwiązano zależności ============================================================================= Pakiet Architektura Wersja Repozytorium Rozmiar ============================================================================= Instalowanie: glibc-devel ppc64 2.8-3 fedora 2.7 M glibc-headers ppc 2.8-3 fedora 600 k kernel-headers ppc 2.6.25-14.fc9 fedora 703 k tcl ppc 1:8.5.1-4.fc9 fedora 2.2 M Podsumowanie transakcji ============================================================================= Instalowanie 4 pakietów Aktualizowanie 0 pakietów Usuwanie 0 pakietów Całkowity rozmiar pobierania: 6.2 M
Aby ułatwić pracę programistom na klastrze instalujemy biblioteki programistyczne. Zbiorcza paczka bibliotek jest dostępna w fedorze pod nazwą development-tools. Instalujemy ją wydając komendę "yum groupinstall "Development Tools". Lista paczek, które zostaną zainstalowane:
============================================================================= Pakiet Architektura Wersja Repozytorium Rozmiar ============================================================================= Instalowanie: autoconf noarch 2.61-10.fc9 fedora 800 k automake noarch 1.10.1-2 fedora 532 k automake14 noarch 1.4p6-15.fc7 fedora 243 k automake15 noarch 1.5-23 fedora 280 k automake16 noarch 1.6.3-14 fedora 297 k automake17 noarch 1.7.9-11 fedora 359 k bison ppc 2.3-5.fc9 fedora 543 k byacc ppc 1.9.20070509-2.fc9 fedora 50 k ccache ppc 2.4-13.fc9 fedora 55 k cscope ppc 15.6-1.fc9 fedora 155 k ctags ppc 5.7-1.fc9 fedora 143 k cvs ppc 1.11.22-13.fc9 fedora 754 k diffstat ppc 1.43-7.fc9 fedora 20 k doxygen ppc 1:1.5.5-3.fc9 fedora 2.6 M elfutils ppc 0.133-3.fc9 fedora 245 k flex ppc 2.5.35-1.fc9 fedora 311 k frysk ppc64 0.2.1-2.fc9 fedora 37 M gcc ppc 4.3.0-8 fedora 6.3 M gcc-c++ ppc 4.3.0-8 fedora 4.3 M gcc-gfortran ppc 4.3.0-8 fedora 4.3 M gdb ppc 6.8-1.fc9 fedora 3.4 M gettext ppc 0.17-4.fc9 fedora 2.4 M indent ppc 2.2.10-1.fc9 fedora 121 k libtool ppc 1.5.24-6.fc9 fedora 685 k ltrace ppc 0.5-10.45svn.fc9 fedora 65 k oprofile ppc 0.9.3-17.fc9 fedora 2.5 M oprofile-gui ppc 0.9.3-17.fc9 fedora 90 k patchutils ppc 0.2.31-5.fc9 fedora 114 k python-ldap ppc 2.3.1-3.fc9 fedora 135 k rcs ppc 5.7-32 fedora 376 k redhat-rpm-config noarch 9.0.2-1.fc9 fedora 54 k rpm-build ppc 4.4.2.3-2.fc9 fedora 314 k strace ppc 4.5.16-5.fc9 fedora 169 k subversion ppc 1.4.6-7 fedora 2.5 M swig ppc 1.3.33-2.fc9 fedora 3.2 M systemtap ppc64 0.6.2-1.fc9 fedora 971 k texinfo ppc 4.11-5.fc9 fedora 853 k valgrind ppc 1:3.3.0-3 fedora 13 M Instalowanie, aby rozwiązać zależności: alsa-lib ppc64 1.0.16-3.fc9 fedora 480 k apr ppc 1.2.12-2.fc9 fedora 139 k apr-util ppc 1.2.12-5.fc9 fedora 82 k atk ppc64 1.22.0-1.fc9 fedora 226 k cairo ppc64 1.6.4-1.fc9 fedora 576 k cpp ppc 4.3.0-8 fedora 3.4 M cups-libs ppc64 1:1.3.7-1.fc9 fedora 219 k elfutils-libelf ppc64 0.133-3.fc9 fedora 66 k elfutils-libs ppc64 0.133-3.fc9 fedora 199 k elfutils-libs ppc 0.133-3.fc9 fedora 192 k gmp ppc 4.2.2-7.fc9 fedora 240 k gnutls ppc64 2.0.4-2.fc9 fedora 420 k gtk2 ppc64 2.12.9-5.fc9 fedora 7.2 M imake ppc 1.0.2-6.fc9 fedora 319 k lcms ppc 1.17-4.fc9 fedora 90 k lcms-libs ppc 1.17-4.fc9 fedora 120 k libXcomposite ppc64 0.4.0-4.fc9 fedora 15 k libXcursor ppc64 1.1.9-2.fc9 fedora 32 k libXext ppc64 1.0.4-1.fc9 fedora 44 k libXfixes ppc64 4.0.3-3.fc9 fedora 16 k libXft ppc64 2.1.12-5.fc9 fedora 52 k libXi ppc64 1.1.3-4.fc9 fedora 31 k libXinerama ppc64 1.0.3-1.fc9 fedora 14 k libXrandr ppc64 1.2.2-3.fc9 fedora 23 k libXrender ppc64 0.9.4-3.fc9 fedora 31 k libXtst ppc64 1.0.3-3.fc9 fedora 22 k libart_lgpl ppc64 2.3.20-1.fc9 fedora 74 k libgcj ppc64 4.3.0-8 fedora 23 M libgcrypt ppc64 1.4.0-3 fedora 259 k libgomp ppc 4.3.0-8 fedora 62 k libgpg-error ppc64 1.6-2 fedora 66 k libjpeg ppc64 6b-41.fc9 fedora 163 k libmng ppc 1.0.9-6.1 fedora 172 k libpng ppc64 2:1.2.24-1.fc9 fedora 265 k libstdc++-devel ppc64 4.3.0-8 fedora 3.9 M libtasn1 ppc64 1.3-1.fc9 fedora 296 k libthai ppc64 0.1.9-4.fc9 fedora 191 k libtiff ppc64 3.8.2-10.fc9 fedora 349 k mpfr ppc 2.3.0-3.fc9 fedora 167 k neon ppc 0.28.2-2 fedora 128 k pakchois ppc 0.4-1 fedora 15 k pango ppc64 1.20.1-1.fc9 fedora 417 k perl-URI noarch 1.35-8.fc9 fedora 117 k pixman ppc64 0.10.0-1.fc9 fedora 69 k qt3 ppc 3.3.8b-12.fc9 fedora 3.8 M sqlite ppc64 3.5.6-2.fc9 fedora 279 k systemtap-runtime ppc64 0.6.2-1.fc9 fedora 55 k Podsumowanie transakcji ============================================================================= Instalowanie 85 pakietów Aktualizowanie 0 pakietów Usuwanie 0 pakietów Całkowity rozmiar pobierania: 138 M W porządku? [t/N]:
Wkładamy płytkę Cell SDK do napędu i ją montujemy
mkdir /mnt/naped
mount /dev/scd0 /mnt/naped
rpm -i /mnt/naped/cell-install-3.1.0-0.0.noarch.rpm ostrzeżenie: cell-install-3.1.0-0.0.noarch.rpm: Nagłówek V3 Podpis DSA: NOKEY, key ID 9ac02885
Jeśli posiadamy obraz płyty cellsdk, należy skonwertować ją do formatu ISO i podmontować z opcją "-o loop"
Instalator został zainstalowany w katalogu /opt/cell
Przechodzimy do katalogu /opt/cell i instalujemy Cell SDK:
[root@m7-ps3a cell]# cd /opt/cell/ [root@m7-ps3a cell]# ./cellsdk --iso /mnt/naped/ install cellsdk INFO-2050: STARTING cellsdk --iso /mnt/naped/ install cellsdk logs to /var/log/cellsdk.log The IBM SDK 3.1 for Multicore Acceleration contains components governed by the following Open Source licenses: GNU Public License (GPL) - see http://www.gnu.org/licenses/gpl.html. GPL licensed components include GCC Toolchain, Linux Kernel, netpbm, oprofile, crash-spu-command, spu_tools, and SYSROOT image. Lesser GNU Public License (LGPL) - see http://www.gnu.org/copyleft/lesser.html. LGPL licensed components include ELFSPE, LibSPE, LibSPE2 and SYSROOT image. Installation and use of this software requires you to certify you have read the licenses above, and accept their terms. To accept these terms, type 'yes' at the prompt below. If you do not wish to accept, type 'no' or press 'ctrl-C' to abort this program without installing. After typing 'yes', you will be presented with licenses for IBM owned code, Follow the instructions on the screen to accept the IBM Licenses and proceed with installation of the SDK. I have read and accept the licenses above [no/yes]: yes
Zostaniemy poproszeni o akceptację Licencji oprogramowania a następnie zostaną rozwiązane zależności:
Rozwiązano zależności ============================================================================= Pakiet Architektura Wersja Repozytorium Rozmiar ============================================================================= Instalowanie: blas ppc64 3.1-7 blas-3.1-7.ppc64.rpm 3.0 M blas ppc 3.1-7 blas-3.1-7.ppc.rpm 2.9 M blas-devel ppc 3.1-7 blas-devel-3.1-7.ppc.rpm 256 k blas-devel ppc64 3.1-7 blas-devel-3.1-7.ppc64.rpm 4.1 k lapack ppc64 3.1.1-6 lapack-3.1.1-6.ppc64.rpm 4.8 M lapack ppc 3.1.1-6 lapack-3.1.1-6.ppc.rpm 4.5 M lapack-devel ppc 3.1.1-6 lapack-devel-3.1.1-6.ppc.rpm 6.0 M lapack-devel ppc64 3.1.1-6 lapack-devel-3.1.1-6.ppc64.rpm 5.6 M libspe2 ppc64 2.2.80-132 libspe2-2.2.80-132.ppc64.rpm 36 k libspe2 ppc 2.2.80-132 libspe2-2.2.80-132.ppc.rpm 34 k libspe2-devel ppc64 2.2.80-132 libspe2-devel-2.2.80-132.ppc64.rpm 7.4 k libspe2-devel ppc 2.2.80-132 libspe2-devel-2.2.80-132.ppc.rpm 7.4 k Instalowanie, aby rozwiązać zależności: alf ppc64 4.0.0-1 CellSDK-Devel-Fedora-ppc64 51 k alf ppc 4.0.0-1 CellSDK-Devel-Fedora-ppc64 45 k Podsumowanie transakcji ============================================================================= Instalowanie 14 pakietów
Po czym zostaną zainstalowane paczki Cell SDK:
Zainstalowano: alf-devel.ppc 0:4.0.0-1 alf-devel.ppc64 0:4.0.0-1 alf-examples-source.noarch 0:4.0.0-1 alf-manpages.noarch 0:4.0-2 alf-spu-devel.ppc 0:4.0.0-1 blas-examples-source.noarch 0:3.1-7 blas-manpages.noarch 0:3.1-2 cell-buildutils.noarch 0:3.1-1 cell-demos.ppc64 0:3.1-1 cell-demos-source.noarch 0:3.1-1 cell-documentation.noarch 0:3.1-1 cell-examples.ppc64 0:3.1-1 cell-examples-source.noarch 0:3.1-1 cell-libs.ppc64 0:3.1-1 cell-libs.ppc 0:3.1-1 cell-libs-devel.ppc64 0:3.1-1 cell-libs-devel.ppc 0:3.1-1 cell-libs-source.noarch 0:3.1-1 cell-tutorial.ppc 0:3.1-1 cell-tutorial-source.noarch 0:3.1-1 dacs.ppc64 0:4.0.0-2 dacs.ppc 0:4.0.0-2 dacs-devel.ppc 0:4.0.0-2 dacs-devel.ppc64 0:4.0.0-2 dacs-examples-source.noarch 0:4.0.0-2 dacs-manpages.noarch 0:4.0-1 lapack-examples-source.noarch 0:3.1.1-6 libfft.ppc64 0:3.1.1-1 libfft.ppc 0:3.1.1-1 libfft-devel.ppc64 0:3.1.1-1 libfft-devel.ppc 0:3.1.1-1 libfft-examples-source.noarch 0:3.1.1-1 libfft-manpages.noarch 0:3.1-1 libmc-examples-source.noarch 0:3.1.0-1 libmc-rand.ppc64 0:3.1.0-1 libmc-rand.ppc 0:3.1.0-1 libmc-rand-devel.ppc 0:3.1.0-1 libmc-rand-devel.ppc64 0:3.1.0-1 libmc-rand-manpages.noarch 0:3.1-3 libspe.ppc 0:1.2.2-2 libspe.ppc64 0:1.2.2-2 libspe2-manpages.noarch 0:3.1-1 ppu-binutils.ppc 0:2.18.50-21 ppu-gcc.ppc 0:4.1.1-166 ppu-gcc-c++.ppc 0:4.1.1-166 ppu-gdb.ppc 0:6.8.50-13 ppu-mass-devel.ppc64 0:5.0.0-3 ppu-mass-devel.ppc 0:5.0.0-3 ppu-simdmath.ppc64 0:3.1-1 ppu-simdmath.ppc 0:3.1-1 ppu-simdmath-devel.ppc64 0:3.1-1 ppu-simdmath-devel.ppc 0:3.1-1 ppu-xlmass-lib.noarch 0:5.0.0-0 simdmath-manpages.noarch 0:3.1-1 spu-binutils.ppc 0:2.18.50-21 spu-gcc.ppc 0:4.1.1-166 spu-gcc-c++.ppc 0:4.1.1-166 spu-gdb.ppc 0:6.8.50-13 spu-mass-devel.ppc 0:5.0.0-3 spu-newlib.ppc 0:1.16.0-17 spu-newlib-manpages.noarch 0:3.1-1 spu-simdmath-devel.ppc 0:3.1-1 spu-xlmass-lib.noarch 0:5.0.0-0 Zainstalowano zależność: compat-expat1.ppc64 0:1.95.8-4 compat-expat1.ppc 0:1.95.8-4 netpbm.ppc64 0:10.35.41-1.fc9 netpbm.ppc 0:10.35.41-1.fc9 Zakończono!
Ponieważ chcemy aby te paczki były zainstalowane z repozytorium IBM'owskiego Cella, a nie z repo Fedory musimy wykonać mały zabieg.
Najpierw odinstalowujemy paczki komendą:
[root@m7-ps3a cell]# yum erase oprofile oprofile-debuginfo blas blas-devel
============================================================================= Pakiet Architektura Wersja Repozytorium Rozmiar ============================================================================= Usuwanie: blas ppc 3.1-7 installed 5.2 M blas ppc64 3.1-7 installed 5.4 M blas-devel ppc64 3.1-7 installed 12 k blas-devel ppc 3.1-7 installed 429 k oprofile ppc 0.9.3-17.fc9 installed 7.8 M Usuwanie, aby rozwiązać zależności: oprofile-gui ppc 0.9.3-17.fc9 installed 241 k Podsumowanie transakcji ============================================================================= Instalowanie 0 pakietów Aktualizowanie 0 pakietów Usuwanie 6 pakietów
Następnie wyłączamy repozytoria fedory w pliku /etc/yum.repos.d/fedora.repo i /etc/yum.repos.d/fedora-updates.repo zmieniając enabled=1 na 0 tak jak na poniższym kodzie:
[fedora] name=Fedora $releasever - $basearch failovermethod=priority #baseurl=http://download.fedora.redhat.com/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/ mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releaseverarch=$basearch enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora file:///etc/pki/rpm-gpg/RPM-GPG-KEY
Ponownie wydajemy komendę instalacji CellSDK. Zostaną w tym momencie zainstalowane tylko brakujące paczki, czyli oprofile i blas - ale z repozytorium IBM, gdyż repo Fedory zostało przez nas wcześniej wyłączone
[root@m7-ps3a cell]# cd /opt/cell/ [root@m7-ps3a cell]# ./cellsdk --iso /mnt/naped/ install
Włączamy z powrotem repozytoria tak jak 2 rozdziały wyżej, z tą, różnicą, że teraz zmieniamy enabled=0 na 1
Następnie dodajemy linijkę exclude w pliku /etc/yum.conf
exclude=oprofile oprofile-debuginfo blas blas-devel
Dzięki temu wpisowi przy aktualizacji systemu menadżerem pakietów yum, blas i oprofile zostaną pominięte. Zabezpieczy to przed nadpisaniem tych narzędzi przez repozytorium Fedory.
Ostatnią rzeczą jest usunięcie niepotrzebnych już repozytoriów IBM, które automatycznie się dodały przy zainstalowaniu aplikacji instalacyjnej CellSDK. Znajdują się one w standardowym katalogu /etc/yum.repos.d/. Usuwamy je komendą:
rm /etc/yum.repos.d/cellsdk-*
Tworzymy bibliotekę libmisc 64-bitową:
[root@m7-ps3a cell]# cd /opt/cell/sdk/src/ [root@m7-ps3a cell]# tar -xf lib_source.tar [root@m7-ps3a cell]# cd /opt/cell/sdk/src/lib/misc [root@m7-ps3a cell]# cp -R ppu ppu64_shared [root@m7-ps3a cell]# cd ppu64_shared [root@m7-ps3a cell]# make
Dopisujemy do /etc/profile dodając na końcu 2 linie:
[root@m7-ps3a cell]# echo "export LD_LIBRARY_PATH=/opt/cell/sdk/usr/lib64/" >> /etc/profile [root@m7-ps3a cell]# echo "export CELL_TOP=/opt/cell/sdk" >> /etc/profile
Pierwsza z nich umożliwi korzystanie z bibliotek cellsdk, w tym misclib bez konieczności podawania ścieżki przy uruchamianiu programów
Druga uchroni przed popularnymi błędami przy wykonywaniu polecenia make aplikacji napisanych pod cell SDK
Najpierw należy wykonać prosty test odpowiedzi poszczególnych konsol za pomocą mpirun:
[m7ps3@m7-ps3a ~]$ mpirun uname -srn |sort -d Linux m7ps301 2.6.25-14.fc9.ppc64 Linux m7ps301 2.6.25-14.fc9.ppc64 Linux m7ps302 2.6.25-14.fc9.ppc64 Linux m7ps302 2.6.25-14.fc9.ppc64 Linux m7ps303 2.6.25-14.fc9.ppc64 Linux m7ps303 2.6.25-14.fc9.ppc64 Linux m7ps304 2.6.25-14.fc9.ppc64 Linux m7ps304 2.6.25-14.fc9.ppc64 Linux m7ps305 2.6.25-14.fc9.ppc64 Linux m7ps305 2.6.25-14.fc9.ppc64 Linux m7ps306 2.6.25-14.fc9.ppc64 Linux m7ps306 2.6.25-14.fc9.ppc64 Linux m7ps307 2.6.25-14.fc9.ppc64 Linux m7ps307 2.6.25-14.fc9.ppc64 Linux m7ps308 2.6.25-14.fc9.ppc64 Linux m7ps308 2.6.25-14.fc9.ppc64 Linux m7ps309 2.6.25-14.fc9.ppc64 Linux m7ps309 2.6.25-14.fc9.ppc64 Linux m7ps310 2.6.25-14.fc9.ppc64 Linux m7ps310 2.6.25-14.fc9.ppc64 Linux m7ps311 2.6.25-14.fc9.ppc64 Linux m7ps311 2.6.25-14.fc9.ppc64 Linux m7ps312 2.6.25-14.fc9.ppc64 Linux m7ps312 2.6.25-14.fc9.ppc64 Linux m7ps313 2.6.25-14.fc9.ppc64 Linux m7ps313 2.6.25-14.fc9.ppc64 Linux m7ps314 2.6.25-14.fc9.ppc64 Linux m7ps314 2.6.25-14.fc9.ppc64 Linux m7ps315 2.6.25-14.fc9.ppc64 Linux m7ps315 2.6.25-14.fc9.ppc64 Linux m7ps316 2.6.25-14.fc9.ppc64 Linux m7ps316 2.6.25-14.fc9.ppc64 Linux xxx.yyy.pk.edu.pl 2.6.25-14.fc9.ppc64
Widzimy, że każda konsola odpowiada i to w dodatku po 2 razy (nodes=2), MPI skonfigurowany jest poprawnie. Pozostaje potestować aplikacje, które pojawią się w innych działach.
W celu usprawnienia pracy nad przygotowaniem programów testowych zostało użyte darmowe środowisko do kompilacji zdalnej BVRDE. Alternatywnym wyborem jest użycie code:blocks(bądź innego IDE) wraz z Uniwin. W tym wypadku jednak lepszym wyborem okazał się BVRDE ze względu na łatwość konfiguracji i bardzo szybką możliwość rozpoczęcia pracy, co w wypadku programów testowych, charakteryzujących się niewielkimi rozmiarami ma kluczowe znaczenie. Zaznaczyć trzeba również, że krok ten można z powodzeniem pominąć na rzecz kompilacji bezpośrednio na danej maszynie klastra.
Konfiguracja i przygotowanie programu są niezwykle proste. Poniżej przedstawiono przygotowanie środowiska do pracy krok po kroku.
Zaraz po uruchomieniu programy możemy właściwie przejść do tworzenia projektu. Tworzymy nowe rozwiązanie(solution) i projekt do niego należący(najlepiej za pomocą wbudowanego kreatora).
Po wybraniu jako typu projektu Remote c++ można przejść do konfiguracji polączenia. Wszędzie ustawiamy te same dane dotyczące naszego połączenia. Najważniejszą częścią jest ścieżka do katalogu projektu.
Kiedy nasz projekt zostanie utworzony, można przejść do dołączania do niego plików źródłowych. Ujawnia się tutaj największa wada BVRDE, gdyż niestety w wersji, która została w tym wypadku użyta nie ma możliwości synchronizacji między katalogiem zdalnym a katalogiem lokalnym. Wszystkie pliki należąc do projektu były tworzone jedynie w katalogu zdalnym i takie właśnie rozwiązanie w tym wypadku okazało się być najlepsze. Jak dodać (lub utworzyć) plik w katalogu zdalnym pokazuje następujący screen.
Jeśli plik wczesniej nie istniał zostanie utworzony.
To już w zasadzie wszystko co jest potrzebne do pracy z BVRDE. Samo IDE, mimo tego, że jest niezwykle proste i z pozoru mało rozbudowane, wyposażone jest w doskonale działający mechanizm zdalnego przesyłania komunikatów z Debuggera(GDB) i integracja tych informacji z całym IDE, tak że w pewnym momencie można zupełnie zapomnieć ze pracujemy na maszynie zdalnej.
W tej części zostaną przedstawione krótkie programy testowe sprawdzające poprawność działania Cell SDK. Do przetestowania podstawowej funkcjonalności będą potrzebne 3 typy programów: wykorzystujący samo PPE, SPE oraz wykorzystujący kooperację między PPE i SPE.
Pierwszy typ programu wykorzystuje samą jednostkę PPE. Efektem działania programu powinno być wyświetlenie się napisu powitalnego przez jednostkę główną PPE.
listing “hello_ppu.cpp”
#include <cstdio> int main(void) { printf("Hello from PPU!\n"); return 0; }
listing “makefile”
PROGRAM_ppu = hello_ppu include /opt/cell/sdk/buildutils/make.footer
Drugi program wykonywany jest przez jednostkę pomocniczą SPE. Efektem działania programu powinno być wyświetlenie się napisu powitalnego przez SPE.
listing “hello_spu.cpp”
#include<cstdio> int main(void) { printf("Hello from SPU!\n"); return 0; }
listing “makefile”
PROGRAM_spu = hello_spu include /opt/cell/sdk/buildutils/make.footer
Trzeci typ to program wykorzystujący zarówno PPE i SPE. Jednostka PPU odpowiedzialna za wywołanie programu głównego ładuje program przeznaczony dla SPE i zleca tejże jednostce wykonanie go w sposób niezależny(w tym wypadku synchroniczny, gdyż program główny czeka na wykonanie podprogramu SPE). W efekcie działania programu głównego(„hello_ppu”) powinniśmy ujrzeć napis powitalny z jednostki SPE.
listing “spu/hello_spu.cpp”
#include <cstdio> int main(void) { printf("Hello from SPE!\n"); return 0; }
listing “spu/makefile”
PROGRAM_spu = hello_spu include /opt/cell/sdk/buildutils/make.footer
listing “hello_ppu.cpp”
#include <cstdlib> #include <libspe2.h> int main() { spe_context_ptr_t spe; unsigned int createflags = 0; unsigned int runflags = 0; unsigned int entry = SPE_DEFAULT_ENTRY; void * argp = NULL; void * envp = NULL; spe_program_handle_t * program; program = spe_image_open("spu/hello_spu"); spe = spe_context_create(createflags, NULL); spe_program_load(spe, program); // Running spe program spe_context_run(spe, &entry, runflags, argp, envp, NULL); // waiting for SPE spe_image_close(program); spe_context_destroy(spe); }
listing “makefile”
PROGRAM_ppu = hello_ppu IMPORTS = -lspe2 include /opt/cell/sdk/buildutils/make.footer
Ostatni przygotowany program testujący Cell SDK używa wielowątkowości do wyświetlenia komunikatu powitalnego z poszczególnych jednostek SPE. W programie została użyta biblioteka „libspe2”, a sam program pokazuje jej pewną ciekawą właściwość, dzięki której to właśnie jej użycie, a nie poprzedniczki „libspe”, jest dziś zalecane. Mimo pozornego skomplikowania, program jest naprawdę prosty, a jego główna idea zajmuje zaledwie kilka linijek kodu. Spoglądając na główną funkcję programu możemy dostrzec brak typowego tworzenia wątku znanego z „libspe”.
Zamiast tego tworzymy tak zwany SPE context, czyli kontekst powiązany z każdą jednostką SPE. Do przechowywania wątków używamy struktur z biblioteki “pthread”(dla wyjaśnienia dodać należy, że struktura thread_arg_t służy do przekazywania argumetów do SPU). Pierwsza pętla tworzy kontekst dla każdego wątku(flaga SPE_EVENTS_ENABLE umożliwia nam w tym wypadku odczyt stanu każdego wątku po jego wykonaniu). Następnie ładujemy program SPU do każdego kontekstu, przygotowujemy parametry wątku, dla którego tworzymy także wątek posix.
Do przetestowania biblioteki należało także zdefiniować zmienną typu spe_stop_info przechowującą stan każdego wątku po jego wykonaniu.. Funkcja spe_context_run blokuje wykonanie następnej instrukcji do czasu wyjścia z wątku, które to następuje po odczytaniu stanu SPU ze struktury spe_stop_info_read i wypisaniu go. Ostatnim krokiem jest oczekiwanie na wyjście z wątku, zniszczenie kontekstu i wyświetlenie czasu trwania powyższych operacji.
Efektem działania programu powinny być wymieszane komunikaty powitalne wraz ze stanem danego SPU równym 0 czyli, że tworzenie wątku dla SPE powiodło się.(status = 0). W przypadku biblioteki „libspe” otrzymywalibyśmy wartości różne od zera, gdyż poprzednia wersja działała w sposób asynchroniczny przez co czasami program nie był w stanie utworzyć wątku dla danej jednostk SPE ze względu na jej zajętość.
listing “spu/hello_spu.cpp”
#include <cstdio> int main(unsigned long long speid, unsigned long long argp, unsigned long long envp) { printf("Hello from SPE! Current task id is 0x%llx\n",speid); return 0; }
listing “spu/makefile”
PROGRAM_spu = hello_spu LIBRARY_embed = hello_spu.a include /opt/cell/sdk/buildutils/make.footer
listing “hello_ppu.cpp”
#include <cstdio> #include <cstdlib> #include <libspe2.h> #include <pthread.h> #include <time.h> #define SPU_THREADS 50 extern spe_program_handle_t hello_spu; typedef struct { spe_context_ptr_t spe; unsigned long long *args; } thread_arg_t; void *run_hello_spu(void *thread_arg) { int ret; thread_arg_t *arg = (thread_arg_t *) thread_arg; unsigned int entry; entry = SPE_DEFAULT_ENTRY; spe_stop_info_t stop_info; ret = spe_context_run(arg->spe, &entry, 0, arg->args, NULL, &stop_info); if (ret < 0) { perror("spe_context_run"); return NULL; } printf("status = %d\n", spe_stop_info_read(arg->spe, &stop_info)); return NULL; } int main(int argc, char **argv) { clock_t start_time, end_time; start_time = clock(); int i; int ret; spe_context_ptr_t spe[SPU_THREADS]; pthread_t thread[SPU_THREADS]; thread_arg_t arg[SPU_THREADS]; for (i = 0; i < SPU_THREADS; i++) { spe[i] = spe_context_create(SPE_EVENTS_ENABLE, NULL); if (!spe[i]) { perror("spe_context_create"); exit(1); } ret = spe_program_load(spe[i], &hello_spu); if (ret) { perror("spe_program_load"); exit(1); } arg[i].spe = spe[i]; arg[i].args = NULL; ret = pthread_create(&thread[i], NULL, run_hello_spu, &arg[i]); if (ret) { perror("pthread_create"); exit(1); } } for (i = 0; i < SPU_THREADS; i++) { pthread_join(thread[i], NULL); ret = spe_context_destroy(spe[i]); if (ret) { perror("spe_context_destroy"); exit(1); } } end_time = clock(); printf("Total seconds elapsed %.2f\n", (float)(end_time - start_time) / (float)CLOCKS_PER_SEC); return 0; }
listing “makefile”
DIRS = spu PROGRAM_ppu = hello_ppu IMPORTS = spu/hello_spu.a -lspe2 -lpthread include /opt/cell/sdk/buildutils/make.footer
W celu przetestowania forwardowania Xów należy połączyć się z konsolą nr 8 z przełącznikiem "-X" tak jak podano na poniższym rysunku. Przedstawione zostały testy 2 mini programów graficznych, gnome-about i xeyes.
Należy pamiętać, że aplikacje będą działać, jeśli na konsoli pojawią się paczki X'ów, oraz będziemy uruchamiać je z systemu na którym jest uruchomiony nasz klient/server X.