Rozdział 2. Instalacja oraz konfiguracja systemu operacyjnego, niezbędnych bibliotek i sieciowego systemu plików dla klastra CellM7

Marcin Borzkiewicz

Michał Skowronek

Paweł Bród

Prowadzący zajęcia projektowe: Rafał Petryniak (strona domowa zajęć projektowych).

Spis treści

1. Instalacja systemu Fedora 9
1.1. Przygotowanie partycjonowania na PS3
1.2. Wybór systemu wywoływanego przy starcie
1.3. Booting at Fedora - instalacja Linux'a
2. Konfiguracja sieci
2.1. Plik konfiguracyjny /etc/sysconfig/network
2.2. Plik /etc/sysconfig/network-scripts/ifcfg-eth0
2.3. Konfiguracja /etc/resolv.conf
2.4. Konfiguracja /etc/hosts
3. Podstawowa Konfiguracja Usług / Systemu
3.1. Konfiguracja firewalla na komputerze zarządzającym
3.2. Konfiguracja firewalla na konsoli
3.3. Konfiguracja strefy czasowej
3.4. Instalacja i konfiguracja sshd
3.5. Konfiguracja nsswitch.conf
3.6. Konfiguracja sysctl.conf
3.7. Dodanie grupy m7
3.8. Dodanie użytkownika m7ps3
3.9. Ustawienie motd
3.10. Instalacja NTP
3.11. Instalacja i konfiguracja NFS
4. Usuwanie zbędnych usług/pakietów
4.1. Wyłączenie demona avahi
4.2. Wyłączenie pozostałych zbędnych usług
4.3. Wyłączenie modułów dźwięku
4.4. Wyłączenie modułu IPV6
5. Instalacja MPI
5.1. Porównanie popularnych MPI
5.2. Instalacja pakietów
5.3. Konfiguracja
5.4. Modyfikacja SSH (automatyczne logowanie po kluczach)
6. Konfiguracja CELL SDK
6.1. Doinstalowanie potrzebnych zaleznosci (tcl glibc64)
6.2. Instalcacja developent tools
6.3. Instalowanie instalatora
6.4. Instalacja z płyty
6.5. Odinstalowanie oprofile i blas
6.6. Blokowanie aktualizacji w Yum
6.7. Zainstalowanie oprofile i blas z repozytorium IBM
6.8. Usunięcie blokady repozytorium Fedory i dodanie wpisów exclude
6.9. Usunięcie repozytorium z IBM
6.10. Postinstalacyjna konfiguracja
7. Testowanie poprawności projektu
7.1. Testowanie OpenMPI
7.2. Testowanie IBM's Cell SDK
7.3. Testowanie aplikacji X

1. Instalacja systemu Fedora 9

1.1. Przygotowanie partycjonowania na PS3

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”

1.2. Wybór systemu wywoływanego przy starcie

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)

1.3. Booting at Fedora - instalacja Linux'a

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.

1.3.1. Konfiguracja sieci

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ęść.

1.3.2. Hasło roota i strefa czasowa

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.

1.3.3. Partycjonowanie dysku

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.

1.3.4. Pakiety

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

2. Konfiguracja sieci

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.

2.1. Plik konfiguracyjny /etc/sysconfig/network

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

2.2. Plik /etc/sysconfig/network-scripts/ifcfg-eth0

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

2.3. Konfiguracja /etc/resolv.conf

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

2.4. Konfiguracja /etc/hosts

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

3. Podstawowa Konfiguracja Usług / Systemu

3.1. Konfiguracja firewalla na komputerze zarządzającym

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

3.2. Konfiguracja firewalla na konsoli

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

3.3. Konfiguracja strefy czasowej

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

3.4. Instalacja i konfiguracja sshd

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

3.5. Konfiguracja nsswitch.conf

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

3.6. Konfiguracja sysctl.conf

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

3.7. Dodanie grupy m7

#groupadd -g 500 m7

3.8. Dodanie użytkownika m7ps3

useradd -d /home/m7ps3 -g m7 -m -u 500 -s /bin/bash m7ps3
passwd m7ps3

3.9. Ustawienie motd

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
--

3.10. Instalacja NTP

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

3.11. Instalacja i konfiguracja NFS

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.

3.11.1. Instalacja i konfiguracja serwera NFS:

[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

3.11.2. Instalacja i konfiguracja klienta NFS:

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"

4. Usuwanie zbędnych usług/pakietów

4.1. Wyłączenie demona avahi

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

4.2. Wyłączenie pozostałych zbędnych usług

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

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

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

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

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

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

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

4.3. Wyłączenie modułów dźwięku

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"

4.4. Wyłączenie modułu IPV6

Klaster nie korzysta z protokołu IP w wersji 6. Dlatego też należy wyłączyć obsługę ipv6 usuwając moduł z jądra:

[root@m7ps312 ~]# lsmod |grep ipv6
ipv6                  411016  18

Dopisanie modułu do blacklist:

[root@m7ps312 ~]# echo "blacklist ipv6" >> /etc/modprobe.d/blacklist

5. Instalacja MPI

5.1. Porównanie popularnych MPI

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).

5.2. Instalacja pakietó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]:

5.3. Konfiguracja

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

5.4. Modyfikacja SSH (automatyczne logowanie po kluczach)

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ę.

6. Konfiguracja CELL SDK

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.

6.1. Doinstalowanie potrzebnych zaleznosci (tcl glibc64)

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

6.2. Instalcacja developent tools

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]:

6.3. Instalowanie instalatora

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

6.4. Instalacja z płyty

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!

6.5. Odinstalowanie oprofile i blas

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

6.6. Blokowanie aktualizacji w Yum

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

6.7. Zainstalowanie oprofile i blas z repozytorium IBM

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

6.8. Usunięcie blokady repozytorium Fedory i dodanie wpisów exclude

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.

6.9. Usunięcie repozytorium z IBM

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-*

6.10. Postinstalacyjna konfiguracja

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

7. Testowanie poprawności projektu

7.1. Testowanie OpenMPI

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.

7.2. Testowanie IBM's Cell SDK

7.2.1. Przygotowanie środowiska testowego (BVRDE)

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.

7.2.2. Testowanie IBM's Cell SDK

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

7.3. Testowanie aplikacji X

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.