<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.lexa.ru/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:base="http://www.gpgpu.ru/rss.xml">
  <channel>
    <title>GPGPU.ru</title>
    <link>http://www.gpgpu.ru/rss.xml</link>
    <description />
    <language>ru</language>
          <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.lexa.ru/gpgpu-ru" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="gpgpu-ru" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.lexa.ru/gpgpu-ru" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.lexa.ru%2Fgpgpu-ru" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
    <title>Административное: call for moderator</title>
    <link>http://www.gpgpu.ru/node/231</link>
    <description>&lt;p&gt;
Надеюсь, посетители сайта этого не видят, но спам в комментарии/ветки форума тут периодически бывает. Когда неделю ничего нет, а когда в один день сразу много. Несмотря на все антиспамы и капчи.
&lt;p&gt;
Летом я не всегда могу его оперативно вычищать, ищу помощника(ов), которые могли бы раз в 1-2 дня просматривать все поступившие свежие комментарии и на спам жать кнопку "это спам".
&lt;p&gt;
Предпочтение отдается давно зарегистрированным постоянным писателям на сайт.
&lt;p&gt;
Пишите в &lt;a href=http://www.gpgpu.ru/contact&gt;обратную связь&lt;/a&gt; или просто по почте (lexa at lexa dot ru) с указанием своего аккаунта на gpgpu.ru
&lt;!--break--&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fPsayZTDFQ8:nDlVPRX3J-c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fPsayZTDFQ8:nDlVPRX3J-c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=fPsayZTDFQ8:nDlVPRX3J-c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fPsayZTDFQ8:nDlVPRX3J-c:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fPsayZTDFQ8:nDlVPRX3J-c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=fPsayZTDFQ8:nDlVPRX3J-c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/fPsayZTDFQ8" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/231#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/4">gpgpu.ru</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/2">Новости сайта</category>
 <pubDate>Sat, 26 Jun 2010 15:53:04 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">231 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>OpenCL 1.1</title>
    <link>http://www.gpgpu.ru/node/227</link>
    <description>&lt;p&gt;
Новостные сайты массово написали, что &lt;a href=http://www.khronos.org/opencl/&gt;Khronos Group&lt;/a&gt; выпустила спецификации OpenCL 1.1 (вот, скажем, &lt;a href=http://www.hardocp.com/news/2010/06/14/opencl_11_specification_released/&gt;HardOCP&lt;/a&gt;).
&lt;p&gt;
&lt;s&gt;Удивительно, но на сайте Khronos об этом знаменательном событи не написано (хотя вот на HardOCP лежит  3-страничный пресс-релиз).  Ну да новость сегодняшняя, сначала пресс-релиз, потом сайт...&lt;/s&gt;уже написано, за час справились. К сожалению, удобного &lt;b&gt;содержательного&lt;/b&gt; диффа не обнаружилось (кроме пресс-релиза), чтобы понять разницу - нужно 300+ страниц спецификации честно прочитать.
&lt;p&gt;
Из пресс-релиза, естественно, ничего существенного понять нельзя.
&lt;p&gt;
Но есть в этом и содержательная сторона: NVidia моментально прислала письмо, что у них есть Conformance Candidate (в письме, впрочем, в некоторых местах написано что OpenCL 1.0, ну так торопились), который доступен на &lt;a href=http://nvdeveloper.nvidia.com/&gt;девелоперском сайте&lt;/a&gt;.
&lt;p&gt;
И действительно, доступен. В числе прочего, там лежат виндовые драйвера версии &lt;b&gt;258.19&lt;/b&gt;, которые, как я понимаю, новее и текущих доступных на оф-сайте бета-драйверов 257.15 и прилагавшихся к свежему Нексусу 257.19.
&lt;p&gt;
А значит можно потестироваться на предмет, исправились ли &lt;a href=http://www.gpgpu.ru/node/217#comment-1580&gt;странности бета-драйверов 257.15&lt;/a&gt;.
&lt;!--break--&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=bC1uC5QzXd0:eO8_7ZUvxM0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=bC1uC5QzXd0:eO8_7ZUvxM0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=bC1uC5QzXd0:eO8_7ZUvxM0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=bC1uC5QzXd0:eO8_7ZUvxM0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=bC1uC5QzXd0:eO8_7ZUvxM0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=bC1uC5QzXd0:eO8_7ZUvxM0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/bC1uC5QzXd0" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/227#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/22">NVidia</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/41">OpenCL</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/18">Анонсы</category>
 <pubDate>Mon, 14 Jun 2010 16:01:07 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">227 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>CUDA 3.1 beta</title>
    <link>http://www.gpgpu.ru/node/217</link>
    <description>&lt;p&gt;
На &lt;noindex&gt;&lt;a href=https://nvdeveloper.nvidia.com/&gt;девелоперском сайте NVIdia&lt;/a&gt;&lt;/noindex&gt; (увы, нужен логин туда), выложили CUDA 3.1 Beta.
&lt;p&gt;
Из реально вкусного, там &lt;b&gt;16-way kernel concurrency&lt;/b&gt;, плюс обновления для CUBLAS/CUFFT.
&lt;p&gt;
Но:
&lt;ul&gt;
&lt;li&gt;Примеров (GPU Computing SDK) пока нету, только сам CUDA Toolkit.
&lt;li&gt;&lt;s&gt;Драйвера, поддерживающие все это дело - только для Tesla. Наверное, можно их поставить обычным хаком (прописав PCI IDs в setup.inf), но я не стал.&lt;/s&gt; Update: драйвера 257.15 для GTX480 появились на сайте NVidia в разделе с &lt;a href=http://www.nvidia.com/Download/Find.aspx?lang=en-us&gt;бета-драйверами&lt;/a&gt;.
&lt;/ul&gt;
Релиз обещают "в следующем месяце", проще подождать.
&lt;p&gt;
&lt;b&gt;Update:&lt;/b&gt; в форум &lt;noindex&gt;&lt;a href=http://www.gpgpu.ru/node/71#comment-1497&gt;запостили ссылку на TPB&lt;/a&gt;&lt;/noindex&gt; со всем этим счастьем.
&lt;b&gt;Update2:&lt;/b&gt; С драйверами 197.xx не работает.
&lt;!--break--&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=MTWqudasTME:2aMdoU6jLP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=MTWqudasTME:2aMdoU6jLP0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=MTWqudasTME:2aMdoU6jLP0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=MTWqudasTME:2aMdoU6jLP0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=MTWqudasTME:2aMdoU6jLP0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=MTWqudasTME:2aMdoU6jLP0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/MTWqudasTME" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/217#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/25">CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/7">NVidia CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/18">Анонсы</category>
 <pubDate>Sun, 16 May 2010 05:39:45 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">217 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>Алгоритмы поиска на графическом процессоре с помощью технологии NVidia CUDA</title>
    <link>http://www.gpgpu.ru/node/212</link>
    <description>&lt;p&gt;В данной статье рассмотрим бинарный поиск и связанную с ним задачу сортировки. Попытаемся сделать теоретическую оценку алгоритмов и провести практические тесты.
&lt;/p&gt;&lt;p&gt;
Введение
&lt;p/&gt;&lt;p&gt;
Данная статья является продолжением темы &lt;a href="http://www.gpgpu.ru/node/200"&gt;«CUDA search»&lt;/a&gt;. В этой теме рассматривался простейший линейный поиск на графическом процессоре с помощью технологии nVidia CUDA. В наихудшем случае т.е. когда искомый элемент массива был последним, алгоритм на GPU превзошел свой аналог на CPU почти на 40%. Количество элементов в массиве было равно количеству процессоров. Такие условия задачи достаточно хороши для GPU. Однако, как быть в других условиях? Как с ними справиться GPU? Подходит ли он для других алгоритмов? Что ж, попытаемся ответить на эти вопросы.&lt;/p&gt;
&lt;!--break--&gt;
&lt;p&gt;Бинарный поиск для CPU&lt;/p&gt;
&lt;p&gt;
Почему бинарный? Во-первых: классическая его реализация достаточная проста в программировании. Другие модификации и улучшения могут оказаться полезными лишь при определенных условиях. Мы же рассматриваем общий случай. 
Во-вторых: «максимум за величину порядка ln2 N сравнений мы найдем искомый ключ (либо установим, что его нет в таблице)» [1, 440c]. Не много других алгоритмов смогут потягаться с таким быстродействием.
И так имеем в самом худшем случае ln2 N сравнений. Правда алгоритм применим лишь для отсортированного списка. Реализация на CPU имеет следующий вид:
&lt;/p&gt;&lt;p&gt;
Исходный код функции выполняемой на CPU:&lt;/p&gt;
&lt;p&gt;
&lt;div class="geshifilter"&gt;&lt;div class="geshifilter-c" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;__host__ &lt;span style="color: #993333;"&gt;void&lt;/span&gt; searchCPU &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #993333;"&gt;float&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; data, &lt;span style="color: #993333;"&gt;int&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; result &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &amp;nbsp;&lt;span style="color: #cc66cc;"&gt;16777200&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// искомый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; i &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// левая граница массива&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; j &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;16&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1024&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1024&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// правая граница &amp;nbsp; &amp;nbsp;массива&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; k &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;while&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; i &amp;lt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; j &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; k &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; i &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;j &lt;span style="color: #66cc66;"&gt;-&lt;/span&gt; i&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;/&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;2&lt;/span&gt; ; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;lt; &amp;nbsp;x &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt; i &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; k &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;gt; &amp;nbsp;x &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt; j &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; k &lt;span style="color: #66cc66;"&gt;-&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; data &lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; k;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #000000; font-weight: bold;"&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
Как видим, действительно ничего сложного. Данный алгоритм значительно превосходит по быстродействию простой линейный поиск (во много сотен раз), реализованный даже на GPU, ведь для линейного поиска имеем N сравнений в худшем случае.  Но, как уже говорилось выше, он возможен лишь для отсортированного списка (о сортировке поговорим чуть ниже). 
Кстати говоря, этот алгоритм намного устойчивее, так как для него практически не имеет значение в какой части списка находиться элемент, тогда как для линейного - от этого напрямую зависит время поиска. Но это в реализации на CPU! На GPU для линейного поиска имеем противоположный случай т.е. достаточно устойчивый алгоритм, т.к. множество потоков может почти одновременно охватить различные участки списка. 
&lt;/p&gt;
&lt;p&gt;Бинарный поиск для GPU.&lt;/p&gt;
&lt;p&gt;
На попытку написать бинарный поиск меня вдохновила статья о параллельном поиске на видеокартах, в которой приводиться график сравнения производительности для CPU и GPU [2], который изображен на рисунке 1.
&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.gpgpu.ru/sites/gpgpu.ru/files/clip_image001.gif"/&gt;&lt;/p&gt;
&lt;p&gt;
Рисунок 1 -  Absolute performance of index search implementations exploiting thread level and SIMD parallelism on the CPU and the GPU with respect to workload.&lt;/p&gt;
&lt;p&gt;
Как видим из графика, быстродействие GPU начинает превосходить свой аналог на CPU лишь на определенной отметке, т.е. при достаточны больших объемах дынных.
Попытаемся реализовать бинарный поиск для GPU и подтвердить или опровергнуть данные в вышеуказанном графике. Но каким образом разделить вычисления между потоками? Первая мысль была самая простая. Разделить весь список на равные участки, в каждом участке выполнять бинарный поиск. Поспешно написанная программа дала невероятный результат. А именно, очень медленный. Нужно заметить, что чем меньше потоков запускалось, тем быстрее выполнялась программа, т.е. ее быстродействие стремиться к одному потоку. Размышления подтвердили бессмысленность написанного. Подумайте сами, например, имеем список из 100 000 элементов и 1 000 потоков. Разделяем список на потоки, получается, что для каждого потока имеем по 100 элементов. Действительно для 100 элементов бинарный поиск должен выполниться быстрее, чем для 100 000. Но как же другие 999 потоков? Они изначально обречены на неудачу. Они будут безуспешно пытаться найти искомый элемент. А сколько ресурсов уйдет на их запуск и выполнение? 
Нужно искать другое решение. После теоретических размышлений оно найдено! Нужно реализовать как бы не бинарный поиск, а поиск такого порядка, сколько у нас потоков. Например, имея 32 потока, будет 32-нарный поиск. &lt;br/&gt;
Алгоритм таков: делим весь список на количество потоков, Каждый поток смотрит один элемент и сравнивает его с искомым. Если это искомый элемент замечательно. Если текущий элемент меньше, запоминаем его как нижнюю границу. Если больше запоминаем как верхнюю границу. Каждый из потоков найдет свой элемент больший или меньший искомого, на нам нужны только граничные элементы, между которыми лежит искомый, следовательно, нужно среди меньших элементов оставить максимум, а среди больших – минимум. Далее повторяем процедуру, но уже не для всего списка а для новых его границ. Повторяем до тех пор пока либо не найдем элемент, либо количество элементов между нижней и верхней границей станет меньше количества потоков. В таком случае для оставшихся элементов применяем любой другой алгоритм, например однопоточный бинарный поиск. 
Рассмотрим пример. &lt;br/&gt;
Пусть имеем 2048 элементов и 32 потока. Для удобства индексы элементов в массиве и их значения будем считать одинаковыми. Ищем, скажем, элемент под номером 65 равный 65. И так первый шаг. Для каждого потока смотрим каждый 32 элемент. т.е. первый поток смотрит первый элемент, второй – элемент номер 32, третий элемент номер 64 и т.д. Каждый поток находит либо больший либо меньший элемент. В данном случае меньшие элементы 1, 32, 64. большие элементы 96, 128...2016. Среди меньших элементов максимальным является 64, среди больших минимальным является 96. И так имеем новые границы списка 64..96. Количество элементов между границами равно 96-64 = 32. Повторяем итерацию. 32 элемента делим на количество потоков, каждый поток смотрит свой элемент. Получает что каждый поток смотрит по одному элементу и находит искомый. Итого имеем всего два шага! Теоретически неплохо. Действительно если оценить алгоритм теоретически, то имеем скорость O = (ln количество потоков N + ln2 количество процессоров) в худшем случае. Теоретически очень неплохо. Попробуем реализовать. 
&lt;/p&gt;
&lt;p&gt;Исходный код возможной реализации, функция для GPU:&lt;/p&gt;
&lt;p&gt;
&lt;div class="geshifilter"&gt;&lt;div class="geshifilter-c" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;__global__ &lt;span style="color: #993333;"&gt;void&lt;/span&gt; searchGPU &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #993333;"&gt;float&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; data, &lt;span style="color: #808080; font-style: italic;"&gt;/*float * search,*/&lt;/span&gt; &lt;span style="color: #993333;"&gt;int&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; result &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; x &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;16&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1024&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1024&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// количество элементов&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; mx &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// нижняя граница&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; mn &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; x&lt;span style="color: #cc66cc;"&gt;-1&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// верхняя граница &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; step; &lt;span style="color: #808080; font-style: italic;"&gt;// шаг&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;x &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &amp;nbsp;&lt;span style="color: #cc66cc;"&gt;16777200&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// искомый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; idx; &lt;span style="color: #808080; font-style: italic;"&gt;// текущий поток&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;while&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; mn &lt;span style="color: #66cc66;"&gt;-&lt;/span&gt; mx &amp;gt; &lt;span style="color: #cc66cc;"&gt;32&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #808080; font-style: italic;"&gt;// пока количество элементов между границами &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #808080; font-style: italic;"&gt;//больше количества потоков (в данном случае потоков 32)&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; step &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;mn &lt;span style="color: #66cc66;"&gt;-&lt;/span&gt; mx&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;/&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;32&lt;/span&gt;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; nt idx &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; mx &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;blockIdx.&lt;span style="color: #202020;"&gt;x&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; blockDim.&lt;span style="color: #202020;"&gt;x&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; threadIdx.&lt;span style="color: #202020;"&gt;x&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; step; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;==&lt;/span&gt; x &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #808080; font-style: italic;"&gt;// найден искомый элемент&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; data &lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; idx;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;break&lt;/span&gt;; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;gt; x &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;lt; mn&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mn &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &amp;nbsp;data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// минимальный среди больших&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;lt; x&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;gt; mx&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mx &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &amp;nbsp;data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt;; &lt;span style="color: #808080; font-style: italic;"&gt;// максимальный среди меньших&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;/p&gt;
Теоретический анализ говорит, что алгоритм должен иметь очень хорошую скорость, в действительности имеем скорость почти в 100 раз большую, по сравнению с первой реализацией, однако, увы, все еще намного меньшую скорости бинарного поиска для CPU.&lt;br/&gt;
В чем же дело? Причин много. Например, копирование данных на видеокарту и обратно. Ресурсы на запуск потоков. Задержка при произвольном чтении элементов из памяти. Все эти факторы сложно учитывать при теоретическом анализе алгоритма. Однако вполне возможно, что реализация данного алгоритма превзойдет бинарный поиск для CPU в задачах внешнего поиска. Когда поступает очень много данных с внешнего накопителя, а не с оперативной памяти. Но тут нужно учитывать много других факторов, например скорость чтения данных с устройства, организацию хранения самих данных на устройстве (да и данные еще должны быть отсортированы), и ориентировать алгоритм уже под эти условия.&lt;/br&gt;
Итак, алгоритм бинарного поиска не очень хорош в реализации на GPU. Но это в случае, если мы ищем один элемент в массиве. А если нам нужно найти массив элементов в массиве? Такая задача идеально подходит для GPU. Тогда мы организуем алгоритм таким образом, что бы каждый поток искал свой элемент, что будет происходить почти одновременно. Теоретически имеем все туже скорость - O = ( ln2N ). Тогда как для CPU реализация представляет из себя последовательный двоичный поиск каждого элемента, что составит O = ( ln2N * M ), где M – количество искомых элементов.
Попробуем проверить сказанное на практике
&lt;/p&gt;
&lt;p&gt;Фрагмент программы, функция для GPU:&lt;/p&gt;
&lt;p&gt;
&lt;div class="geshifilter"&gt;&lt;div class="geshifilter-c" style="font-family: monospace;"&gt;&lt;ol&gt;&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;__global__ &lt;span style="color: #993333;"&gt;void&lt;/span&gt; searchGPU &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; &lt;span style="color: #993333;"&gt;float&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; data, &lt;span style="color: #993333;"&gt;float&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; search&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; idx &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; blockIdx.&lt;span style="color: #202020;"&gt;x&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; blockDim.&lt;span style="color: #202020;"&gt;x&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; threadIdx.&lt;span style="color: #202020;"&gt;x&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #808080; font-style: italic;"&gt;//data – массив данных&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #808080; font-style: italic;"&gt;//search – искомый массив&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; i &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; j &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;16&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1024&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;*&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1024&lt;/span&gt;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; k &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;while&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; i &amp;lt;&lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; j &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; k &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; i &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt;j &lt;span style="color: #66cc66;"&gt;-&lt;/span&gt; i&lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;/&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;2&lt;/span&gt; ;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;lt; &amp;nbsp;search&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; i &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; k &lt;span style="color: #66cc66;"&gt;+&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#40;&lt;/span&gt; data&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;k&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &amp;gt; &amp;nbsp;search&lt;span style="color: #66cc66;"&gt;&amp;#91;&lt;/span&gt;idx&lt;span style="color: #66cc66;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;j &lt;span style="color: #66cc66;"&gt;=&lt;/span&gt; k &lt;span style="color: #66cc66;"&gt;-&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;; &amp;nbsp;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: bold; font-style: italic;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #b1b100;"&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #000000; font-weight: bold;"&gt;break&lt;/span&gt;; &amp;nbsp; &amp;nbsp; &lt;span style="color: #808080; font-style: italic;"&gt;//элемент найден &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;
&lt;li style="font-family: monospace; font-weight: normal;"&gt;&lt;div style="font-family: monospace; font-weight: normal; font-style: normal"&gt;&lt;span style="color: #66cc66;"&gt;&amp;#125;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Данная программа на GPU работает в тысячи раз быстрее, чем на CPU, что подтверждает вышесказанное об эффективности алгоритма на GPU в случае поиска массива элементов.&lt;/p&gt;
&lt;p&gt;
Сортировка на GPU.
&lt;/p&gt;
&lt;p&gt;
Какую из сортировок лучше всего выбрать для реализации на GPU?
«Было изобретено достаточно большое количество алгоритмов сортировки, основных из них более 25 «такое пугающее количество методов на самом деле лишь малая толика всех алгоритмов, придуманных на сегодняшний день. Почему же существует так много методов сортировки? Ответ если не очевиден, то в полнее понятен – каждый метод имеет свои преимущества и недостатки, поэтому он оказывается эффективнее других при некоторых конфигурациях данных и аппаратуры» [1, 76c].&lt;br/&gt;
Обратимся за помощью к книге Кнута, «искусство программирования» в которой он проводит достаточно подробный анализ всех алгоритмов и подводит резюме.&lt;br/&gt;
«Алгоритм битонной сортировки, полезен, если можно одновременно выполнять большое число сравнений» [1, 400c] Т.е. алгоритм идеально подходит для реализации на GPU. А теперь Взглянем в SDK и находим там готовый пример, реализации данного алгоритма на CUDA.&lt;br/&gt;
Битонная сортировка, несомненно, является быстрее её аналога для CPU. Таким образом, я считаю, что если в задаче поиска имеется подзадача сортировки, то вполне оправданно использовать сначала битонную сортировку на GPU (хотя это так же зависит от конфигурации данных и аппаратуры), а затем применить бинарный поиск на CPU (так же зависит конфигурации данных и аппаратуры). Однако, это в тех случаях, когда сортировка окупит себя в дальнейшем. Если постоянно ведется поиск данных, то разумеется, имеет смысл упорядочить эти данные, что бы потом сэкономить время на поиске. 
&lt;/p&gt;
&lt;p&gt;Снова о поиске &lt;/p&gt;
&lt;p&gt;
Возможны и другие случаи, например, когда данные динамически меняются, или просто поиск осуществляется относительно редко. Отличным примером может служить обычный текст. Возможность поиска в текстовом редакторе неотъемлемая его функция. В данном случае, имеет смысл организовать поиск с помощью параллельной технологии т.к. однопоточный алгоритм на CPU вынужден будет просматривать весь текст последовательно (пусть и не по каждой букве, а с определенным шагом), что к тому же, делает алгоритм неустойчивым, т.к. время поиска напрямую зависит от положения искомой строки в тексте. В случае же алгоритма на GPU имеем более независимый поиск, т.к. множество потоков может начинать просмотр текста с различных его участков. &lt;br/&gt;
Не будем подробно рассматривать этот случай, так как он будет аналогичен поиску элемента в числовом массиве, рассмотренному в первой статье. В наилучшем и среднем случае алгоритм на CPU безусловно выиграет по времени поиска, однако в худшем случае, когда искомый элемент будет в конце списка, он проиграет GPU. Разумеется, если речь идет о достаточном большом количестве данных. Какой из алгоритмов лучше использовать однозначно ответить нельзя. В случае CPU мы будем иметь поиск, который может значительно растягиваться по времени, а в случае с GPU будем иметь достаточно постоянное время поиска. 
&lt;/p&gt;
&lt;p&gt;Выводы&lt;/p&gt;
&lt;p&gt;
И так, подведем итоги. В общем можно сказать, что GPU особенно приспособлены решать проблемы, которые могут быть адаптированы к параллельным вычислениям, когда одна и та же программа (алгоритм) выполняется над многими элементами данных параллельно, требующих интенсивных расчетов: от простых арифметических операций до операций над памятью. Выполнение одной и той же программа для многих элементов данных одновременно снижает требование к изощренному контролю потоков.&lt;br/&gt;
Параллельное вычисление распределяет элементы данных между одновременно выполняющимися потоками. Многие приложения, которые обрабатывают большие объемы данных могут использовать модель параллельных вычислений для повышения производительности. Многие алгоритмы не из области обработки изображений могут быть улучшены с помощью параллельных вычислений, начиная с обработки сигналов или физического моделирования систем и заканчивая вычислительной экономикой или биологией.&lt;br/&gt;
Однако ускорение алгоритмов с помощью технологии nVidia CUDA далеко не панацея и имеет ряд недостатков и ограничений среди которых особенности архитектуры и особенности программирования. 
Теоретический анализ алгоритмов не всегда применим в случае технологии nVidia CUDA, т.к. не учитывает многих ее особенностей. Например, вложенный механизм распараллеливания функций и запуска потоков, особенности работы с памятью, конфигурацию оборудования и .т.п. 
Что качается темы дано статьи, т.е. алгоритмов поиска можно одназначно отметить одну вещь – CUDA эффективна в таких алгоритмах, где CPU вынужден повторять итерации, а CUDA может сделать то же самое в разных потоках. Другими словами,  если при переносе алгоритма с CPU на GPU мы избавляемся от цикла и переносим его на потоки.&lt;br/&gt;
Так же нужно отметить общее высказывание, о том, что CUDA эффективна в таких задачах, где на входе имеем большой массив данных и на выходе так же имеем большой массив данных. 
&lt;/p&gt;
&lt;p&gt;СПИСОК СОКРАЩЕНИЙ &lt;/p&gt;
&lt;p&gt;
CUDA - Compute Unified Device Architecture&lt;br/&gt;
GPU - Graphic Processor Unit&lt;br/&gt;
CPU - Central Processor Unit&lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;СПИСОК ЛИТЕРАТУРЫ&lt;/p&gt;
1. Кнут Д.Э. Искусство программирования, том 3. Сортировка и поиск, 2-е изд. — М.: «Вильямс», 2007. — С. 824. — ISBN 0-201-89685-0&lt;br/&gt;
2. &lt;a href = "http://www.usenix.org/event/hotpar09/tech/full_papers/kaldeway/kaldeway_html/"&gt;Parallel search on video cards, article, oracle server technologies – special projects&lt;/a&gt;&lt;br/&gt;
&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;Автор: Бокатюк Олег&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=GdwTZClTkW4:FPms6iWcuZk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=GdwTZClTkW4:FPms6iWcuZk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=GdwTZClTkW4:FPms6iWcuZk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=GdwTZClTkW4:FPms6iWcuZk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=GdwTZClTkW4:FPms6iWcuZk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=GdwTZClTkW4:FPms6iWcuZk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/GdwTZClTkW4" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/212#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/7">NVidia CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/66">search</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/60">поиск</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/1">Статьи</category>
 <pubDate>Thu, 29 Apr 2010 19:10:38 +0000</pubDate>
 <dc:creator>lex_NTU</dc:creator>
 <guid isPermaLink="false">212 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>Административное: новые разделы форума</title>
    <link>http://www.gpgpu.ru/node/204</link>
    <description>&lt;p&gt;
По многочисленным просьбам,  заведены новые разделы &lt;a href=http://www.gpgpu.ru/forum&gt;Форума&lt;/a&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;a href=http://www.gpgpu.ru/forum/62&gt;NVidia CUDA&lt;/a&gt;
&lt;li&gt;&lt;a href=http://www.gpgpu.ru/forum/63&gt;OpenCL&lt;/a&gt;
&lt;li&gt;&lt;a href=http://www.gpgpu.ru/forum/64&gt;DirectCompute (DX11)&lt;/a&gt;
&lt;li&gt;&lt;a href=http://www.gpgpu.ru/forum/65&gt;ATI Stream (кроме OpenCL)&lt;/a&gt;
&lt;/ul&gt;
&lt;p&gt;
Старые топики будут частично перенесены в новые разделы в рабочем порядке (дело это ручное, а потому мучительное).
&lt;p&gt;
Кроме того, напоминаю о двух возможных удобствах, важных если вы размещаете исходный текст программы или его кусок:
&lt;!--break--&gt;
&lt;dl&gt;
&lt;dt&gt;Начало/конец фрагмента кода нужно помечать тегами &amp;lt;code&amp;gt;.... &amp;lt;/code&amp;gt;&lt;/dt&gt;
&lt;dd&gt;
В этом случае парсер не съест знаки больше-меньше, разметит номера строк и читать ваш код будет куда приятнее.
&lt;/dd&gt;
&lt;dt&gt;Если хочется разместить большой фрагмент или целую программу и т.п.,&lt;/dt&gt;
&lt;dd&gt; то при создании топика в форуме надлежит использовать закладку &lt;strong&gt;File attachments&lt;/strong&gt;, тогда ваш архив будет прицеплен к топику. Это возможно только для стартового сообщения топика и только для зарегистрированных/авторизованных пользователей, но, увы, не для комментариев и не для анонимусов.
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
Кроме того, напоминаю, что я (как админ сайта) заинтересован в авторах. Если вы хотите писать не в форум, а "на первую страницу", пишите через &lt;a href=/contact&gt;contact form&lt;/a&gt; и вы будете повышены до автора.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=395RF2I68A4:tQgCWQp4i8o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=395RF2I68A4:tQgCWQp4i8o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=395RF2I68A4:tQgCWQp4i8o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=395RF2I68A4:tQgCWQp4i8o:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=395RF2I68A4:tQgCWQp4i8o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=395RF2I68A4:tQgCWQp4i8o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/395RF2I68A4" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/204#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/4">gpgpu.ru</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/2">Новости сайта</category>
 <pubDate>Sun, 18 Apr 2010 12:34:18 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">204 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>Про CUDA на русском</title>
    <link>http://www.gpgpu.ru/node/202</link>
    <description>&lt;span class="inline inline-left"&gt;&lt;img src="http://www.gpgpu.ru/sites/gpgpu.ru/files/images/1001637624.jpg" alt="" title=""  class="image image-_original " width="200" height="283" /&gt;&lt;/span&gt;
&lt;p&gt;
Судя по регулярно задаваемым тут вопросам, эта тема многих интересует, поэтому анонсирую.
&lt;p&gt;
Довольно давно анонсированная книга по CUDA начала, наконец, продаваться:
&lt;ul&gt;
&lt;li&gt;&lt;a href=http://www.ozon.ru/context/detail/id/5080841/&gt;Озон&lt;/a&gt;
&lt;li&gt;&lt;a href=http://www.bolero.ru/books/9785940745785.html?terms=Cuda&gt;Болеро&lt;/a&gt;
&lt;li&gt;&lt;a href=http://www.books.ru/shop/search?search_type=+&amp;query=cuda&amp;inw=1&gt;books.ru&lt;/a&gt;
&lt;/ul&gt;
дешевле всего в Озоне (294 рубля), но там дата поступления в доставку- 26 апреля. В books.ru - поступление ожидается 20-го, а Болеро просто пишет что отправят за день (но не проверял).
&lt;p&gt;
Из аннотации:
&lt;blockquote&gt;
&lt;p&gt;
Данная книга посвящена программированию современных графических процессоров (GPU) на основе технологии CUDA от компании NVIDIA. В книге разбираются как сама технология CUDA, так и архитектура поддерживаемых GPU и вопросы оптимизации, включающие использование .PTX.
&lt;p&gt;
Рассматривается реализация целого класса алгоритмов и последовательностей на CUDA.
&lt;p&gt;
К книге прилагается CD, который содержит примеры решения на CUDA реальных задач с большим объемом вычислений из широкого класса областей, включая моделирование нейронных сетей, динамику движения элементарных частиц, геномные исследования и многое другое. 
&lt;/blockquote&gt;
&lt;p&gt;Не читал, поэтому пока про содержание не имею мнения.
&lt;p&gt;P.S. Спасибо компании NVidia (московской) за мониторинг состояния издания книги.
&lt;!--break--&gt;
&lt;div class="image-clear"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=V5DO3Ku66nI:ymzqe4Yxhr0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=V5DO3Ku66nI:ymzqe4Yxhr0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=V5DO3Ku66nI:ymzqe4Yxhr0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=V5DO3Ku66nI:ymzqe4Yxhr0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=V5DO3Ku66nI:ymzqe4Yxhr0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=V5DO3Ku66nI:ymzqe4Yxhr0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/V5DO3Ku66nI" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/202#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/7">NVidia CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/18">Анонсы</category>
 <pubDate>Fri, 16 Apr 2010 08:35:13 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">202 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>OpenCL: ATI + NVidia, текущее состояние дел (windows)</title>
    <link>http://www.gpgpu.ru/node/184</link>
    <description>&lt;p&gt;По случаю выхода &lt;a href=http://developer.amd.com/stream&gt;ATI Stream SDK 2.01&lt;/a&gt;,  описанное в &lt;a href=http://www.gpgpu.ru/node/147&gt;предыдущей статье&lt;/a&gt; несколько устарело. Теперь все иначе, по меньшей мере под Windows.
&lt;p&gt;
&lt;b&gt;OpenCL.DLL&lt;/b&gt; устанавливается и драйверами NVidia (поверх имеющегося) и ATI SDK (только если в системе такого нет? если в системе есть более старый?) . При этом тот вариант, который ставят драйвера NVidia 196.xx - хороший, позволяющий работать и с NVidia и с ATI картами без каких-то избыточных телодвижений, а вот ATI-шный в двухкарточном варианте у меня вызывал непонятные проблемы.
&lt;!--break--&gt;
&lt;p&gt;
Другими словами, надежнее после установки ATI SDK установить свежие драйвера NVidia еще раз.
&lt;p&gt;
Поддержка OpenCL ICD наконец то заработала, поэтому находятся следующие устройства:
&lt;ul&gt;
&lt;li&gt;Если к обоим картам подключены мониторы, а в пути (PATH) находится atiocl.dll (atiocl64.dll на 64-битной системе), то будут найдены оба GPU (+CPU-устройство, обеспечиваемое драйверами ATI).
&lt;li&gt;Если от NVidia отключить монитор, то устройство пропадает из списка найденных (трюк с запуском PhysX на такой карте не работает,  собственно такой настройки нет).
&lt;li&gt;Если отключить монитор от ATI-карты, то Platform остается в списке устройств, однако судя по скорости расчета - он происходит на CPU.
&lt;/ul&gt;
&lt;p&gt;
Кроме того,  интеграция с OpenGL полностью работает только если карта NVidia сделана primary display (скажем, в примере oclNbody отрисовка параметров работает во всех случаях, а отрисовка результатов расчетов - только на primary display).
&lt;p&gt;
Все остальное, что я сумел проверить - работает как ожидается: вычисления запускаются на нужном устройстве и все вообще соответствует ожиданиям, вроде бы получается считать и на двух устройствах сразу.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=XBxiDHwqWBk:Q-ax-gaI1NI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=XBxiDHwqWBk:Q-ax-gaI1NI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=XBxiDHwqWBk:Q-ax-gaI1NI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=XBxiDHwqWBk:Q-ax-gaI1NI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=XBxiDHwqWBk:Q-ax-gaI1NI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=XBxiDHwqWBk:Q-ax-gaI1NI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/XBxiDHwqWBk" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/184#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/17">ATI</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/22">NVidia</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/41">OpenCL</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/1">Статьи</category>
 <pubDate>Sat, 20 Feb 2010 13:56:42 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">184 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>Административное: новый поиск</title>
    <link>http://www.gpgpu.ru/node/177</link>
    <description>&lt;p&gt;Собирался года два, наконец собрался. Поиск на сайте заменен на наш (&lt;a href=http://www.ashmanov.com/tech/search/&gt;&amp;laquo;Ашманов и Партнеры&amp;raquo;&lt;/a&gt;). 
&lt;p&gt;
Теперь русский язык - склоняется (английский - тоже, но это и раньше было), если вы искали &lt;b&gt;шейдер&lt;/b&gt;, то &lt;b&gt;шейдеры&lt;/b&gt; тоже найдутся.  Поддерживается язык запросов: кавычки, и-или-не (краткое описание &lt;a href=http://www.novoteka.ru/txt/howtosearch&gt;есть тут&lt;/a&gt;).
&lt;p&gt;
Индексируются и тексты и комментарии.
&lt;p&gt;
Я ниасилил сделать модуль для Drupal, вместо этого асилил jQuery. 
&lt;p&gt;
Должно работать везде (как jquery и положено), ну может кроме MSIE 5.x (и не жалко), при обнаружении каких-то проблем просьба писать в комментарии в этом сообщении.
&lt;!--break--&gt;
&lt;p&gt;
P.S. Листалку делать тоже поленился. Выдаются первые 30 результатов, если их реально больше, то к 31-му результату никак не попасть, используйте "минус-слова" (чтобы поискать все тексты где есть OpenCL и нет NVidia нужно задать запрос &lt;b&gt;OpenCL ~nvidia&lt;/b&gt;).&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=7YGJBxB8hRg:E12E_ohP1EY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=7YGJBxB8hRg:E12E_ohP1EY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=7YGJBxB8hRg:E12E_ohP1EY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=7YGJBxB8hRg:E12E_ohP1EY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=7YGJBxB8hRg:E12E_ohP1EY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=7YGJBxB8hRg:E12E_ohP1EY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/7YGJBxB8hRg" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/177#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/2">Новости сайта</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/60">поиск</category>
 <pubDate>Mon, 08 Feb 2010 19:21:58 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">177 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>NVdia Nexus: работа из виртуальной машины</title>
    <link>http://www.gpgpu.ru/articles/nvidia-nexus-and-vmware.html</link>
    <description>&lt;p&gt;После &lt;a href=http://www.gpgpu.ru/node/175&gt;успеха с запуском NVidia Nexus&lt;/a&gt; на двух машинах, я загорелся сделать это на одной. 
&lt;p&gt;
Стандартные системные требования в этом случае простые: две G92/G200 видеокарты, к одной подключается монитор (мониторы, если их несколько), вторая настраивается как "ускоритель PhysX" (без подключенного монитора) и все должно работать.
&lt;p&gt;
У меня в рабочей машине - две видеокарты, но &lt;a href=http://www.gpgpu.ru/node/147&gt;одна из них NVidia, а вторая - ATI&lt;/a&gt; и сделать так, как написано выше - невозможно, если отключить от NVidia-карты мониторы, то она &lt;b&gt;пропадает&lt;/b&gt; из системы, запустить CUDA-программу даже локально (без Nexus) не выходит. Вынимать ATI (менять на NVidia) не хотелось, для третьей двухслотовой карты места в машине нет, покупать еще одну видеокарту хотелось еще меньше.
&lt;/p&gt;
&lt;!--break--&gt;
&lt;h3&gt;Первая попытка: локальный запуск (epic fail)&lt;/h3&gt;
&lt;p&gt;
Если работать локально, то все работает.... до первой остановки на breakpoint внутри kernel. Даже если все активные окна расположены на мониторе, подключенном к ATI, в момент остановки на точке остановки все зависает.
&lt;p&gt;
Судя по особенностям процесса установки в локальном режиме ("рабочая" карта должна стать PhysX-ускорителем), в любых других режимах и должно виснуть.
&lt;h3&gt;Вторая попытка: виртуальная машина&lt;/h3&gt;
&lt;p&gt;
В то же время, при удаленной отладке ATI-шный монитор остается живым и активным, а значит зависания - не обязательное свойство.
&lt;p&gt;
Завожу второй Windows в виртуальной машине (VMWare), ставлю туда Visual Studio, ставлю туда Host-часть Nexus, настраиваю удаленную работу......&lt;b&gt;все работает, включая и пошаговую отладку&lt;/b&gt;. Естественно, окно виртуальной машины располагаю на ATI-шном мониторе.
&lt;p&gt;
Я не уверен, что все работает "100-% устойчиво", но пару десятков сессий пошаговой отладки удалось провести без малейших проблем.
&lt;p&gt;
Получается, что с виБрртуальной машиной (со второго компьютера) у меня в первый раз не завелось по причине &lt;s&gt;общей жизненной неустроенности&lt;/s&gt; каких-то проблем с установкой Nexus Monitor, тогда же у меня вообще почти ничего не завелось, ни синхронизация, ни secure access.
 &lt;h3&gt;Мораль&lt;/h3&gt;
&lt;p&gt;
Требование двух G92/G200 видеокарт является необязательным, вполне можно обойтись одной G92/G200 (для запуска CUDA) и одной какой-нибудь.

&lt;h3&gt;Аппаратные подробности&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
 Windows7/x64, Core i7, много дисков и памяти.
&lt;li&gt;  Primary Display (в терминах Windows) - подключен к ATI HD5870, драйвера ATI последние (10.1)
&lt;li&gt; Второй монитор - подключен к GTX280, драйвера рекомендованные для Nexus (195.62)
&lt;li&gt;На самой машине пускаем Nexus Monitor
&lt;li&gt;В виртуальной машине (тоже Windows 7) пускаем Nexus Host, подключаемся к настоящей машине "по сети".
&lt;li&gt;Окно виртуальной машины на primary display, поэтому неотрисовки и т.п. на втором мониторе (при висении в отладчике) - не волнуют.
&lt;li&gt;Виртуальная машина - VMWare Workstation, 7.0.1,  VMWare tools установлены (включая дисплейный адаптер)
&lt;li&gt; Из возможно важных настроек (но менять не пробовал) - сеть в VMware  bridged.
&lt;/ul&gt;

&lt;h3&gt;И еще&lt;/h3&gt;
&lt;p&gt;Отсутствие conditional breakpoints очень сильно уменьшает полезность. Если мне нужен не пошаговый режим, а именно остановка в случае "А меньше 5, Б больше 8", то придется такой if() рисовать, перекомпилировать и в нем и останавливаться. Прям девятнадцатый век...&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=2fPT0V7gvYU:g-DAm8BrCuc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=2fPT0V7gvYU:g-DAm8BrCuc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=2fPT0V7gvYU:g-DAm8BrCuc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=2fPT0V7gvYU:g-DAm8BrCuc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=2fPT0V7gvYU:g-DAm8BrCuc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=2fPT0V7gvYU:g-DAm8BrCuc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/2fPT0V7gvYU" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/articles/nvidia-nexus-and-vmware.html#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/25">CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/58">NVidia Nexus</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/59">VMWare</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/1">Статьи</category>
 <pubDate>Thu, 04 Feb 2010 15:00:53 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">176 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>NVidia Nexus: нулевые шаги</title>
    <link>http://www.gpgpu.ru/node/175</link>
    <description>&lt;p&gt;
&lt;b&gt;UPDATE:&lt;/b&gt; от большинства проблем удалось избавиться просто переустановкой NVidia Nexus на обеих машинах. Secure connection заработала, синхронизация - преимущественно заработала, хотя бывают необъяснимые сбои (и тогда надо удалить синхронизируемые файлы с той машины, на которую копируем т.е. ту, где Nexus Monitor).
&lt;p&gt;
&lt;b&gt;Update2&lt;/b&gt; И с виртуальной машиной &lt;a href=http://www.gpgpu.ru/articles/nvidia-nexus-and-vmware.html&gt;тоже получилось&lt;/a&gt;, поэтому проще поменять полностью текст, чем вносить еще поправки: 
&lt;ol&gt;
&lt;li&gt;Если не работает синхронизация или Secure connection (при стандартных настройках, когда вы ничего не меняли)  - попробуйте переставить Nexus Monitor, мне помогло.
&lt;li&gt;Иногда (закономерность понять не удалось) синхронизация файлов не может синхронизироваться. Тогда нужно вручную удалить синхронизируемые файлы с той машины, где запущен Nexus Monitor (на Win7/Vista это %user profile%/AppData/Roaming/Nvidia corporation/Nexus/Monitor/Mirror/)
&lt;/ol&gt;
&lt;!--break--&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=DuOexWA7EhY:zQq4sjnVfl8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=DuOexWA7EhY:zQq4sjnVfl8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=DuOexWA7EhY:zQq4sjnVfl8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=DuOexWA7EhY:zQq4sjnVfl8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=DuOexWA7EhY:zQq4sjnVfl8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=DuOexWA7EhY:zQq4sjnVfl8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/DuOexWA7EhY" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/175#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/58">NVidia Nexus</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/1">Статьи</category>
 <pubDate>Mon, 01 Feb 2010 18:15:05 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">175 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>Курс по CUDA для всех желающих (Москва)</title>
    <link>http://www.gpgpu.ru/announces/cuda-msu-2010.html</link>
    <description>&lt;p&gt;
В прошлом году я прощелкал, а в этом - нет, успеваю анонсировать.
&lt;p&gt;
С 24 февраля по 12 мая, еженедельно, по вторникам, на ВМиК МГУ (Москва, Воробьевы горы, м. Университет) будет читаться второй уже курс программирования NVidia CUDA &lt;b&gt;для всех желающих&lt;/b&gt;.
&lt;p&gt;
Процитирую из анонса:
&lt;blockquote&gt;
&lt;i&gt;
Московский Государственный Университет им. М.В. Ломоносова совместно с компанией NVIDIA приглашает заинтересованных студентов пройти специализированный курс "Архитектура и программирование массивно-параллельных вычислительных систем" на основе технологии CUDA. В рамках курса вы узнаете о современных многоядерных архитектурах, моделях программирования и основополагающих принципах,  лежащих в основе построения эффективных параллельных алгоритмов. Вы также познакомитесь с реализациями типичных алгоритмов и задач, возникающих в цифровой обработке сигналов, математическом моделировании и гидродинамике. По окончании курса вы сможете применить свои знания на практике уже сегодня при решении вычислительноемких задач в ваших курсовых и дипломных работах. Приобретенные знания необходимы для всех, кто планирует связать свое будущее с высокими технологиями и высокопроизводительными вычислениями. Всем студентам, успешно завершившим курс "Архитектура и программирование массивно-параллельных вычислительных систем" будут выданы дипломы.
&lt;/i&gt;
&lt;/blockquote&gt;
&lt;!--break--&gt;
&lt;p&gt;Ссылки:
&lt;ul&gt;
&lt;li&gt;&lt;a href=http://groups.google.ru/group/cudacsmsusu?lnk=srg&amp;hl=ru&amp;ie=UTF-8&gt;Анонс курса на Google Groups&lt;/a&gt;
&lt;li&gt;&lt;a href=http://groups.google.ru/group/cudacsmsusu/web/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0+%D0%BA%D1%83%D1%80%D1%81%D0%B0?hl=ru&gt;программа курса&lt;/a&gt;
&lt;/ul&gt;
&lt;p&gt;
По первой ссылке вы сможете найти время начала, номер аудитории и просьбу о регистрации. Сюда я время начала и аудиторию не пишу намеренно, чтобы по ссылке таки сходили....&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=YqekSQbzxYU:P4ErHV5D3xE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=YqekSQbzxYU:P4ErHV5D3xE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=YqekSQbzxYU:P4ErHV5D3xE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=YqekSQbzxYU:P4ErHV5D3xE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=YqekSQbzxYU:P4ErHV5D3xE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=YqekSQbzxYU:P4ErHV5D3xE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/YqekSQbzxYU" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/announces/cuda-msu-2010.html#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/25">CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/18">Анонсы</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/55">ВМиК МГУ</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/30">курсы</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/57">Москва</category>
 <pubDate>Fri, 22 Jan 2010 14:28:23 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">167 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>Еще об NVidia и ATI в одной машине</title>
    <link>http://www.gpgpu.ru/node/155</link>
    <description>&lt;p&gt;
Как ни печально, но поведение драйверов NVidia ничем не лучше драйверов ATI: чтобы CUDA/OpenCL работали, к какой-то видеокарте NVidia должен быть подключен какой-то из активных дисплеев. 
&lt;p&gt;
Таким образом, идея потестировать NVidia Nexus на одной машине с двумя видеокартами, одна ATI и одна NVidia, полностью провалилась: если к Geforce не подключать монитор, то с точки зрения CUDA/NEXUS этой карты не существует. Вот если бы у меня было две карты NVidia, разговор был бы другой. Еще одна карта NVidia у меня есть, но слоты кончились....
&lt;p&gt;
Конечно, у меня есть еще немножко компьютеров и Nexus я найду как потестировать (или вытащу ATI, вставлю G80), но обидно, да. Ограничение чисто софтверное и явно на пустом месте (ATI это тоже касается, та же фигня).&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=OW4CjRtaW6E:IB3D818l2FM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=OW4CjRtaW6E:IB3D818l2FM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=OW4CjRtaW6E:IB3D818l2FM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=OW4CjRtaW6E:IB3D818l2FM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=OW4CjRtaW6E:IB3D818l2FM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=OW4CjRtaW6E:IB3D818l2FM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/OW4CjRtaW6E" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/155#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/25">CUDA</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/54">Nexus</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/22">NVidia</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/1">Статьи</category>
 <pubDate>Thu, 31 Dec 2009 14:01:23 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">155 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>AMD/ATI Stream SDK 2.0</title>
    <link>http://www.gpgpu.ru/node/152</link>
    <description>&lt;p&gt;
Вышел &lt;a href=http://developer.amd.com/gpu/ATIStreamSDK/Pages/default.aspx&gt;ATI Stream SDK 2.0&lt;/a&gt; (релиз).
&lt;p&gt;
Лично меня интересует &lt;b&gt;только OpenCL&lt;/b&gt;, поэтому и смотрел я исключительно с этих позиций:
&lt;!--break--&gt;
&lt;ul&gt;
&lt;li&gt;Примеры, ранее требовавшие primary display на карте ATI (NBody) - теперь стали работать нормально, главное OpenCL.dll подсунуть от ATI.
&lt;li&gt;Появилась интеграция OpenCL-OpenGL, но бинарной совместимости с таковой интеграцией у NVidia нет, поэтому примеры из NVIdia GPU Computing SDK без перекомпиляции на ATI не работают (а с перекомпиляцией - не пробовал). Мне не очень нужно, но из общих соображений кажется, что починят.
&lt;li&gt;Есть поддержка OpenCL ICD (Installable client drivers). В теории это должно дать возможность выбирать аппаратуру из имеющейся на ходу. По факту - этого не происходит, во всяком случае oclDeviceQuery/CLInfo показывают только ту карту, OpenCL.dll от которой попался первым в пути.&lt;br/&gt;
В &lt;a href=http://forums.amd.com/devforum/messageview.cfm?catid=390&amp;threadid=124208&amp;enterthread=y&gt;этом топике форума AMD&lt;/a&gt; пишут, что возможно OpenCL.dll разных версий (размер - точно разный), таким образом есть надежда, что проблема как-то будет починена.
&lt;li&gt;Появился профайлер, хотя с первого взгляда не очень понятный.
&lt;/ul&gt;
&lt;p&gt;
Больше ничего толком за полдня не посмотрел, но общее впечатление такое, что с beta4 стало несколько лучше.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=52C-jB9p2-Y:iyjQ23iKiZw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=52C-jB9p2-Y:iyjQ23iKiZw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=52C-jB9p2-Y:iyjQ23iKiZw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=52C-jB9p2-Y:iyjQ23iKiZw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=52C-jB9p2-Y:iyjQ23iKiZw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=52C-jB9p2-Y:iyjQ23iKiZw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/52C-jB9p2-Y" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/152#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/16">AMD</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/17">ATI</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/41">OpenCL</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/53">Stream SDK</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/18">Анонсы</category>
 <pubDate>Wed, 23 Dec 2009 19:03:17 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">152 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>ATI HD4xxx и OpenCL</title>
    <link>http://www.gpgpu.ru/node/148</link>
    <description>&lt;p&gt;Читал &lt;a href=http://forums.amd.com/devforum/index.cfm?FTVAR_SUBCAT=202&amp;nocookies=y&amp;subcatname=Software%20Development%20Topics&gt;форумы AMD&lt;/a&gt;, много думал.
&lt;p&gt;
Вычитал &lt;a href=http://forums.amd.com/devforum/messageview.cfm?catid=390&amp;threadid=123857&amp;enterthread=y&gt;грустное про HD4xxx и OpenCL&lt;/a&gt;:
&lt;dl&gt;
&lt;dd&gt;
The HD4XXX series was not designed for OpenCL whereas the HD5XXX series was. There will be performance improvements on this series because of improvements in the HD5XXX series, so it will get better, but it is not our focus.
&lt;/dd&gt;
&lt;dd&gt;
&lt;i&gt;For example, if you are using local memory, they are all currently emulated in global memory. So it is possible you are going out to main memory twice as often as you do on NVidia. This can cause a fairly large performance hit if the application is memory bound. On the HD5XXX series, local memory is mapped to hardware local and thus is many times faster than the HD4XXX series.&lt;/i&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
Как мы помним на примере NVidia, ключ к высокой производительности многих приложений (ну кроме простейших молотилок, ограниченных скоростью потока из глобальной памяти) - именно в здравом использовании локальной памяти. А тут такой облом....
&lt;p&gt;
Другими словами, &lt;i&gt;если вас интересует результат&lt;/i&gt;, то под 4xxx надо программировать сильно иначе, например локальный storage делать на регистрах (если их хватит).
&lt;p&gt; А значит - и такую карту надо купить и иметь в хозяйстве (если интересует результат), поубивав бы.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=C-lMfimYcWo:lWs_FAuo1yA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=C-lMfimYcWo:lWs_FAuo1yA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=C-lMfimYcWo:lWs_FAuo1yA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=C-lMfimYcWo:lWs_FAuo1yA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=C-lMfimYcWo:lWs_FAuo1yA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=C-lMfimYcWo:lWs_FAuo1yA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/C-lMfimYcWo" height="1" width="1"/&gt;</description>
     <comments>http://www.gpgpu.ru/node/148#comments</comments>
 <category domain="http://www.gpgpu.ru/taxonomy/term/17">ATI</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/41">OpenCL</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/11">Обзоры веба</category>
 <pubDate>Sun, 20 Dec 2009 16:26:48 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">148 at http://www.gpgpu.ru</guid>
  </item>
  <item>
    <title>OpenCL, NVidia, ATI и все все все....</title>
    <link>http://www.gpgpu.ru/node/147</link>
    <description>&lt;p&gt;Вопрос о совместимости OpenCL между железом разных производителей - является необычайно волнительным. Понятно, что задумывалось все совместимым, но насколько это получилось и сколько граблей разложено на пути к этой совместимости - отдельный интересный вопрос, который перешел в практическую плоскость сразу после выпуска ATI Stream SDK 2.0 beta 4, где появилась поддержка OpenCL на графическом адаптере. До того поддержка OpenCL на PC была только у NVidia и вопрос был сугубо теоретическим.
&lt;p&gt;
Как только мне в руки попал Radeon HD5870, так сразу захотелось тему исследовать... и в первом приближении я ее изучил.
&lt;!--break--&gt;
&lt;h2&gt;Первое приближение: жизнь есть&lt;/h2&gt;
Более того, какая-то совместимость достигается и без перекомпиляции приложений.
Если быть точным то:
&lt;ul&gt;
&lt;li&gt;Часть примеров из NVidia SDK работает  на оборудовании ATI,  часть - работает частично (т.к. нет нужных свойств, например интеграции OpenCL/OpenGL), часть - не работает. Все проверялось без перекомпиляции/перелинковки приложений, на готовых бинарных файлов.
&lt;li&gt;Аналогично, часть примеров ATI SDK работает без проблем, часть - ругается, дескать не хватает чго-то.
&lt;/ul&gt;
&lt;p&gt;
Но в первом приближении - жить можно. Да, надо иметь зоопарк железа для тестирования т.к. архитектура везде разная и оптимальные kernels, соответственно, будут тоже разными.
&lt;/p&gt;
&lt;h2&gt;DLL Hell&lt;/h2&gt;
&lt;p&gt;
DLL Hell имеется в полный рост, причем есть все предпосылки к тому, что дальше будет еще хуже:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenCL.dll для карты NVidia поставляется вместе с драйвером и впоследствии оказывается в \Windows\SysWOW64 (у меня 64-битная система, на 32-битной наверное окажется в Windows\System32)
&lt;li&gt;OpenCL.dll для ATI - является частью SDK и ставится в \Program Files\ATI Stream
&lt;/ul&gt;
Соответственно, в зависимости от $PATH приложение работает с одной, либо другой видеокартой.
&lt;p&gt;
Как только ATI включит эту DLL в поставку драйверов - сразу начнется драка с NVidia в полный рост, я предсказываю это.
&lt;/p&gt;
&lt;h2&gt;Странности с ATI&lt;/h2&gt;
&lt;p&gt;
Часть примеров ATI SDK работает нормально только если монитор, подключенный к Radeon является primary display.  Код этих примеров я внимательно не рассматривал, на невнимательный взгляд такого быть не должно бы. Нужно разбираться, возможно это происки бета-версии.

&lt;h2&gt;Производительность&lt;/h2&gt;
&lt;p&gt;
Оценка производительности - задача сложная, особенно с учетом разницы в архитектурах. Поэтому приведу лишь одну цифру, относиться к которой нужно крайне осторожно.
Один шаг примера Nbody (из ATI SDK) с числом частиц 9984 исполняется, согласно его внутренней измерялке:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;280 миллисекунд на CPU (i7, 3.6Ghz)
&lt;li&gt;28 миллисекунд на ATI HD5870
&lt;li&gt;12 миллисекунд на NVidia GTX280
&lt;/ul&gt;
&lt;p&gt;
При увеличении размеров задачи относительная разница между GPU уменьшается (66/45 ms для 19968 частиц), возможно дело вообще в стадии инициализации или еще в чем-то подобном. В то же время, я ожидал, что HD5870 будет заметно быстрее GTX280, возможно архитектура NVidia больше подходит именно к задаче многих тел.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fpOH67KYMfA:mn02RQo8ElU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fpOH67KYMfA:mn02RQo8ElU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=fpOH67KYMfA:mn02RQo8ElU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fpOH67KYMfA:mn02RQo8ElU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lexa.ru/~ff/gpgpu-ru?a=fpOH67KYMfA:mn02RQo8ElU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/gpgpu-ru?i=fpOH67KYMfA:mn02RQo8ElU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/gpgpu-ru/~4/fpOH67KYMfA" height="1" width="1"/&gt;</description>
     <category domain="http://www.gpgpu.ru/taxonomy/term/17">ATI</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/22">NVidia</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/41">OpenCL</category>
 <category domain="http://www.gpgpu.ru/taxonomy/term/1">Статьи</category>
 <pubDate>Sun, 20 Dec 2009 16:11:26 +0000</pubDate>
 <dc:creator>lexa</dc:creator>
 <guid isPermaLink="false">147 at http://www.gpgpu.ru</guid>
  </item>
  </channel>
</rss>
