Rinnakkaistamisen sijasta on vielä yksi optio, eli pipelining. Jossa tehtävät pilkotaan liukuhihnalle. Joissain ratkaisuissa tämä toimii varsin mainiosti. Kuten esimerkiksi datan pakaamisessa joka on monivaiheinen prosessi. Kokonaissuorituskyky kasvaa vaikka rinnakkaistamista ei ole toteutettu lainkaan. Tätä lähestymistä olen käyttänyt tekemissäni softissa aika usein. Tietysti ongelmana on se, että täyttä käyttöastetta tällä ei välttämättä saavuteta. Mutta moni prosessi tehostuu silti olennaisesti, varsinkin neliytimisellä koneella. Datan sisäänlukeminen, esikäsittely, prosessointi, jälkiprosessointi ja tallentaminen kaikki omissa threadeissan. Valmiit objektit sitten kopitetaan threadista toiseen. Näin myös datan "jatkuva" jakaminen prosessoriytimien kesken jää vähäiseksi. Joka voi olla ongelma ns. täydellistä rinnakkaistamista hakiessa. Pitkiä synkronointeja tulee tolkuttomasti kun veivataan jatkuvasti jaettuja suuria datamassoja.
Kokemusta esim. valtavien XML aineistojen konvertonnissa tietorakenteesta toiseen, homma pelaa hienosti. Jos tehtävän prosessointi vaihe on riittävän raskas ja mielekkäästi rinnastettavissa, sen voi vielä rinnastaa N threadiin. Mutta aina ei olla niin onnekkaita.
Tuo pipelining oli yllättävän helppo toteuttaa. Konvertointi sovellus oli alunperin kirjoitettu javalla ja toimi jo valmiiksi järkevissä askeleissa vaikkakin suoritettiin yhtenä threadina. Askeleiden eriyttäminen omiksi säikeikseen ei tuottanut sen suurempia tuskia. Ongelmia alkoi muodostua kun aineiston käsittelyyn alkoi yöajossa menemään yli kuusi tuntia. Nyt aika on alle puolittunut neliprosessorisessa koneessa. Ainakin omasta mielestäni pidän tuota säätämisprojektia onnistuneena.
Mitä tulee tavallisiin työpöytäsovelluksiin. Olen aika pitkällä sillä linjalla, että kunhan se TOIMII niin kaikki on hyvin. Mielettömään optimointiin ja tuunaukseen ei kannata käyttää resurseja nykyjään. Kehitystyö on se kallein resurssi, rautaa saa aina halvemmalla lisää. Sama pätee myös siihen miksi käytetään aina vain korkeamman tason ohjelmointikieliä. Äärimmäisyyksiin vietynä: Jos tekisi kaikki softat assemblerilla, jokaiselle prosessorille tehtäisiin oma optimoitu versio ja toteutettaisiin vain välttämättömät funktiot saataisiin lisää vauhtia sovelluksiin käsittämättömän paljon. Kaunis visio, mutta aika kaukana todellisuudesta.
Pythonia olen tässä viimeaikoina katsellut, lienee ilmeisen suosittu *nix puolella. Ruby olisi kuulemma vielä parempi, mutta sen kehitys on ilmeisesti hieman vaiheessa, kääntäjän ilmoitukset todella hämäriä jne. No eipä nuo Javankaan virheilmoitukset järkyttävän selkeitä ollut ennen kuin niihin oikein perehtyi.
Sitten käytännön ongelmiin. Esim uusissa prosessoreissa hehkutettiin uusia multimedia toimintoja? Mitä sitten? Kun softat ei edes tue vielä moniytimisyyttä. Arvatkaa vaan kummalla olisi suurempi tehtostava vaikutus sovellusten toimintaan.
FFMPEG ei tue h.264 videon purkamista monisäikeisenä. Näin ollen Q6600 @ 2.4 GHz prosessorin tehot loppuu yhden coren osalta videon toistossa. Pitäisi varmaan hommata tehokkaampi prosessori (huom, ei prosessorit).