{"id":67,"date":"2008-11-25T19:27:10","date_gmt":"2008-11-25T18:27:10","guid":{"rendered":"http:\/\/netrix.org.pl\/index.php\/2008\/11\/25\/fenomen-sse\/"},"modified":"2009-12-11T23:16:42","modified_gmt":"2009-12-11T22:16:42","slug":"fenomen-sse","status":"publish","type":"post","link":"http:\/\/netrix.org.pl\/index.php\/2008\/11\/25\/fenomen-sse\/","title":{"rendered":"Fenomen SSE"},"content":{"rendered":"<p>Na warsztacie pojawi\u0142 si\u0119 ostatnio bardzo ciekawy <a href=\"http:\/\/forum.gamedev.pl\/index.php\/topic,8814.30.html\">temat<\/a> dotycz\u0105cy wykorzystania instrukcji procesora przetwarzaj\u0105cych dane potokowo. Jak wiadomo ka\u017cdemu programi\u015bcie, ka\u017cdy procesor wspiera r\u00f3\u017cny zestaw funkcji (poniewa\u017c s\u0105 one do\u0142\u0105czane do poprzednich). O to lista tych rozszerze\u0144:<\/p>\n<ul>\n<li>MMX (operacje na liczbach ca\u0142kowitych)<\/li>\n<li>SSE (operacje zmiennoprzecinkowe pojedynczej precyzji)<\/li>\n<li>SSE2 (operacje zmiennoprzecinkowe podw\u00f3jnej precyzji)<\/li>\n<li>SSE3 (konwersje i dodawanie w poziomie)<\/li>\n<li>SSSE3 (dodatkowe dzia\u0142ania na liczbach ca\u0142kowitych)<\/li>\n<li>SSE4 (dodatkowe instrukcje wektorowe, w tym upragniony iloczyn skalarny dw\u00f3ch wektor\u00f3w)<\/li>\n<\/ul>\n<p>O ile rozszerzenie MMX korzysta z rejestr\u00f3w koprocesora (co czyni go niewydajnym, poniewa\u017c prze\u0142\u0105czanie mi\u0119dzy MMX a koprocesorem trwa troch\u0119 czasu), o tyle pozosta\u0142e rozszerzenia wprowadzaj\u0105 dodatkowe rejestry xmm (8 dla procesor\u00f3w 32-bitowych oraz 16 dla procesor\u00f3w 64-bitowych) po 128 bit\u00f3w ka\u017cdy. Rejestry te s\u0105 traktowane tak jak jest to wymagane do danej funkcji, zatem dla liczb ca\u0142kowitych jest ca\u0142e 128-bitowe s\u0142owo lub mo\u017cna dzieli\u0107 na p\u00f3\u0142, a\u017c do uzyskania 16 osobnych bajt\u00f3w. W przypadku liczb zmiennoprzecinkowych s\u0105 to 4 liczby typu float lub 2 liczby typu double.<\/p>\n<p>Dost\u0119pne funkcje pozwalaj\u0105 wykonywa\u0107 obliczenia zar\u00f3wno skalarnie jak i wektorowo. Oczywi\u015bcie najlepiej jest gdy przeprowadzane operacje s\u0105 g\u0142\u00f3wnie wektorowe, poniewa\u017c pozwala to zaoszcz\u0119dzi\u0107 mn\u00f3stwo cennych cykli procesora. Najwi\u0119kszy problem to oczywi\u015bcie pisanie operacji przy u\u017cyciu tych funkcji, poniewa\u017c wymagana jest podstawowa znajomo\u015b\u0107 Assemblera, chocia\u017c dzi\u0119ki tzw. <a href=\"http:\/\/en.wikipedia.org\/wiki\/Intrinsic_function\">funkcjom intrinsics<\/a> wcale nie trzeba robi\u0107 w kodzie wstawek asemblerowych, gdy\u017c funkcje robi\u0105 to zamiast programisty.<\/p>\n<p>Przyznam szczerze, mnie r\u00f3wnie\u017c\u00a0 bardzo interesuj\u0105 te funkcje, dlatego postanowi\u0142em z ich pomoc\u0105 napisa\u0107 w\u0142asn\u0105 implementacje wektor\u00f3w i macierzy (r\u00f3wnie\u017c dlatego, \u017ce te w D3DX, nie maj\u0105 tego wsparcia). Jest to do\u015b\u0107 \u017cmudna robota, poniewa\u017c trzeba jako\u015b zagwarantowa\u0107 to, \u017ceby moje wektory ruszy\u0142y na starszych komputerach (a nu\u017c trzeba b\u0119dzie), ale mimo wszystko uwa\u017cam, \u017ce warta zachodu. Mog\u0119 ju\u017c powiedzie\u0107, \u017ce funkcja obliczaj\u0105ca d\u0142ugo\u015b\u0107 wektora, dzi\u0119ki instrukcj\u0105 z rozszerzenia SSE, jest szybsza od wersji z D3DX.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Na warsztacie pojawi\u0142 si\u0119 ostatnio bardzo ciekawy temat dotycz\u0105cy wykorzystania instrukcji procesora przetwarzaj\u0105cych dane potokowo. Jak wiadomo ka\u017cdemu programi\u015bcie, ka\u017cdy procesor wspiera r\u00f3\u017cny zestaw funkcji (poniewa\u017c s\u0105 one do\u0142\u0105czane do poprzednich). O to lista tych rozszerze\u0144: MMX (operacje na liczbach ca\u0142kowitych) SSE (operacje zmiennoprzecinkowe pojedynczej precyzji) SSE2 (operacje zmiennoprzecinkowe podw\u00f3jnej precyzji) SSE3 (konwersje i dodawanie [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31],"tags":[179,20,22,67],"_links":{"self":[{"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/67"}],"collection":[{"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/comments?post=67"}],"version-history":[{"count":4,"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions"}],"predecessor-version":[{"id":348,"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/posts\/67\/revisions\/348"}],"wp:attachment":[{"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/media?parent=67"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/categories?post=67"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/netrix.org.pl\/index.php\/wp-json\/wp\/v2\/tags?post=67"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}