{"id":3431,"date":"2018-04-24T11:30:05","date_gmt":"2018-04-24T10:30:05","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3431"},"modified":"2018-04-24T11:32:06","modified_gmt":"2018-04-24T10:32:06","slug":"3431","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3431","title":{"rendered":"C++ Guns: Levenshtein-Distanz - Teil 3"},"content":{"rendered":"<p>Im dritten Teil geht es um die Parallelisierung mit OpenMP. Auf dem Arbeitsrechner werden 1000 zuf\u00e4llig gef\u00fcllte Strings in 71.6 sec. Der Algorithmus ist trivial \u00fcber die \u00e4usserste Schleife zu parallelisieren, da ein String unabh\u00e4nig der anderen Berechnet werden kann.<\/p>\n<p>Um eine schnelle \u00dcbersicht \u00fcber die systime zu bekommen, wird das Programm mittels dem Hilfsprogramm 'time' gestartet. Die systime betr\u00e4gt 0m0.004s dieses Wert m\u00fcssen wir nach der Parallelisierung optimalerweise wieder erreichen.<\/p>\n<p>Ein einfaches<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#pragma omp parallel for\r\n    for(int i=0; i &lt; strings.size(); ++i) {\r\n<\/pre>\n<p>und schon brummen alle 8 Threads des AMD FX 8350 los. Die Zeit sagt 12.7 sec mit 0m0.008s systime. Das entspricht einem Speedup von 5.6 70%. Ein normaler Wert f\u00fcr den ersten Versuch. Um ein besseres Gef\u00fchl zu bekommen wie der Algorithmus skaliert, wird nochmal mit nur 4 Threads getestet. Es ist stark CPU abh\u00e4ngig ob ob auch alle Kerne einer CPU mit voller Leistung brummen k\u00f6nnen.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">$ OMP_NUM_THREADS=4  time .\/LevenshteinTerror<\/pre>\n<p>Mit 4 Threads ergeben sich 18.4 sec und ein Speedup von 3.89 97%. Besser geht es eigentlich garnicht.<\/p>\n<p>Damit k\u00f6nnen wir gleich zu einer dickeren CPU wechseln: Intel Xeon E5-2680 mit 32 Kerne. Hier die Ergebnisse:<\/p>\n<pre>\r\nThreads Time [sec] Speedup Eff [%]\r\n1       67.7          -      -\r\n2       33.9        2      100 \r\n4       17.0        3.98   99.5\r\n8        9.22       7.34   91.8\r\n16       4.94      13.7    85.6\r\n32       4.54      14.9    46.6\r\n<\/pre>\n<p>Bis zu der H\u00e4lfte der Threads skaliert der Algorithmus gut, danach gibt es keinen Weiteren Speedup. Es werden in diesem Beispiel auch keine Unmengen an Daten verarbeitet, die CPU ist der Flaschenhals, nicht der RAM Bus.<\/p>\n<p>Zum Abschluss noch eine Messung mit 16 und 32 Threads mit der 10-fachen Menge an Strings.<\/p>\n<pre>\r\nThreads Time [sec] Speedup Eff [%]\r\n1       6709          -      -\r\n16      475         14.1    88.1\r\n32      447         15.0    46.9\r\n<\/pre>\n<p>Zwei Stunden v.s. 8 Minuten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im dritten Teil geht es um die Parallelisierung mit OpenMP. Auf dem Arbeitsrechner werden 1000 zuf\u00e4llig gef\u00fcllte Strings in 71.6 sec. Der Algorithmus ist trivial \u00fcber die \u00e4usserste Schleife zu parallelisieren, da ein String unabh\u00e4nig der anderen Berechnet werden kann. Um eine schnelle \u00dcbersicht \u00fcber die systime zu bekommen, wird das Programm mittels dem Hilfsprogramm [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3431","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3431"}],"version-history":[{"count":4,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3431\/revisions"}],"predecessor-version":[{"id":3435,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3431\/revisions\/3435"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3431"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}