<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>東方算程譚</title><link>http://blogs.wankuma.com/episteme/</link><description>Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。</description><managingEditor>επιστημη</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>επιστημη</dc:creator><title>東京だよおっかさん</title><link>http://blogs.wankuma.com/episteme/archive/2010/09/01/192685.aspx</link><pubDate>Wed, 01 Sep 2010 19:18:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/09/01/192685.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192685.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/09/01/192685.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192685.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192685.aspx</trackback:ping><description>&lt;P&gt;プロダクト受け入れテストと次版の設計のため&lt;BR&gt;急遽デッチ上げられたプロジェクトに飛び込むことになり、&lt;BR&gt;机のお引越ししてました。&lt;/P&gt;
&lt;P&gt;東京タワーすぐそば一等地26階角部屋、&lt;BR&gt;こんなの↓を背にシゴトしてます。&lt;/P&gt;&lt;IMG src="http://episteme.wankuma.com/photo/tokyo_tower.jpg"&gt; 
&lt;P&gt;右隅にスカイツリーがほんのり。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192685.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>OpenCL(7) ホスト-デバイス間のやりとり</title><link>http://blogs.wankuma.com/episteme/archive/2010/09/01/192684.aspx</link><pubDate>Wed, 01 Sep 2010 19:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/09/01/192684.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192684.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/09/01/192684.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192684.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192684.aspx</trackback:ping><description>&lt;P&gt;そゆわけで、先週日曜は兎さんとやきそば食って&lt;BR&gt;悟空茶荘で茶ぁしばきながら&lt;STRONG&gt;愛と平和&lt;/STRONG&gt;を熱く語るはずもなく、&lt;BR&gt;GPGPUがどーしたこーしたなんつーおよそ茶席にはそぐわぬ&lt;BR&gt;ネタで盛り上がったわけですが。&lt;/P&gt;
&lt;P&gt;兎さん曰く：「ATI Streamてばホスト-デバイス間のデータ転送が速くねぇ」&lt;BR&gt;...そぉなの?&lt;/P&gt;
&lt;P&gt;GPGPUはホスト(マザボ)にぶっ挿したデバイス(グラボ)に対し&lt;BR&gt;あれやこれやと命令投げて処理を行います。&lt;BR&gt;で、ホストはデバイスの持ってるメモリに直接アクセス&lt;STRONG&gt;できません&lt;/STRONG&gt;。&lt;BR&gt;なので必要に応じてホスト→デバイス,ホスト←デバイスなメモリ転送&lt;BR&gt;コマンドを発行し、その完了を待たにゃならんです。そのスピードが&lt;STRONG&gt;イマイチ&lt;/STRONG&gt;とのこと。&lt;/P&gt;
&lt;P&gt;おうち帰ってやってみた。1024x1024個のfloat(=4MB)領域に対し1000回の&lt;BR&gt;書き込み(ホスト→デバイス)と読み込み(ホスト←デバイス)にかかる時間を計ってみる。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;#include &amp;lt;iostream&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;#include &amp;lt;vector&amp;gt;&lt;BR&gt;#include &amp;lt;string&amp;gt;&lt;BR&gt;#include &amp;lt;utility&amp;gt;&lt;BR&gt;#include &amp;lt;cassert&amp;gt;&lt;BR&gt;#include &amp;lt;Windows.h&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;#define __CL_ENABLE_EXCEPTIONS&lt;BR&gt;#include &amp;lt;CL/cl.hpp&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;using namespace std;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int main() try {&lt;BR&gt;&amp;nbsp; vector&amp;lt;cl::Platform&amp;gt; platforms;&lt;BR&gt;&amp;nbsp; cl::Platform::get(&amp;amp;platforms);&lt;BR&gt;&amp;nbsp; assert( !platforms.empty() );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; cl_context_properties properties[] = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};&lt;BR&gt;&amp;nbsp; cl::Context context(CL_DEVICE_TYPE_GPU, properties); &lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp; std::vector&amp;lt;cl::Device&amp;gt; devices = context.getInfo&amp;lt;CL_CONTEXT_DEVICES&amp;gt;();&lt;BR&gt;&amp;nbsp; assert( !devices.empty() );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; const size_t N = 1024*1024;&lt;BR&gt;&amp;nbsp; vector&amp;lt;float&amp;gt; host_buffer(N, 0.0f);&lt;BR&gt;&amp;nbsp; cl::Buffer buffer(context, CL_MEM_READ_WRITE, N*sizeof(float));&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; cl::CommandQueue queue(context, devices[0]);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; DWORD t0, t1;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; // かきかき&lt;BR&gt;&amp;nbsp; t0 = GetTickCount();&lt;BR&gt;&amp;nbsp; for ( int i = 0; i &amp;lt; 1000; ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueWriteBuffer(buffer, CL_TRUE, 0, N*sizeof(float), &amp;amp;host_buffer[0]);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; t1 = GetTickCount();&lt;BR&gt;&amp;nbsp; cout &amp;lt;&amp;lt; "Write 1000 times: " &amp;lt;&amp;lt; (t1-t0) &amp;lt;&amp;lt; "[ms]\n";&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; // よみよみ&lt;BR&gt;&amp;nbsp; t0 = GetTickCount();&lt;BR&gt;&amp;nbsp; for ( int i = 0; i &amp;lt; 1000; ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueReadBuffer(buffer,CL_TRUE, 0, N*sizeof(float), &amp;amp;host_buffer[0]);&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; t1 = GetTickCount();&lt;BR&gt;&amp;nbsp; cout &amp;lt;&amp;lt; "Read&amp;nbsp; 1000 times: " &amp;lt;&amp;lt; (t1-t0) &amp;lt;&amp;lt; "[ms]\n";&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;} catch ( const cl::Error&amp;amp; err ) {&lt;BR&gt;&amp;nbsp; cerr &amp;lt;&amp;lt; "OpenCL error " &amp;lt;&amp;lt; err.err() &amp;lt;&amp;lt; " :" &amp;lt;&amp;lt; err.what() &amp;lt;&amp;lt; endl; &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;ATI Stream SDK 2.2 / ATI Radeon HD5450 DDR2-512MB での結果:&lt;BR&gt;&lt;FONT face="Courier New"&gt;Write 1000 times: &lt;STRONG&gt;11766&lt;/STRONG&gt;[ms]&lt;BR&gt;Read&amp;nbsp; 1000 times: &lt;STRONG&gt;5313&lt;/STRONG&gt;[ms]&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;ほほー、書き込みは読み込みの倍以上の時間がかかるですね。&lt;BR&gt;ホスト-デバイス間のメモリ転送(特にホスト→デバイス)はパフォーマンスを落とすのか。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192684.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>白牙奇蘭</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/29/192634.aspx</link><pubDate>Sun, 29 Aug 2010 23:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/29/192634.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192634.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/29/192634.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192634.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192634.aspx</trackback:ping><description>&lt;P&gt;ひさしぶりの茶ネタ。&lt;BR&gt;今年の夏休みも終わったです。明日からおしごと、行きたくないよぅ...&lt;/P&gt;
&lt;P&gt;わんくま同盟横浜勉強会、たくさんのオーディエンスに集まっていただきました。&lt;BR&gt;懇親会も盛況でした、ホントありがとうございます。&lt;BR&gt;&lt;BR&gt;勉強会当日夜行バスで岩手から&lt;STRONG&gt;すっ飛んで&lt;/STRONG&gt;来てくれた&lt;STRONG&gt;兎さん&lt;/STRONG&gt;に&lt;BR&gt;何のお相手もできなかったので、今日のお昼はおもてなし。&lt;BR&gt;つーてもいつものごとく茶ぁ買って茶ぁしばいただけですが。&lt;BR&gt;昼飯はネタ度の高い&lt;A href="http://www.bairanjp.com/"&gt;梅蘭&lt;/A&gt;やきそばなどを。&lt;BR&gt;&lt;BR&gt;兎さんの茶買い出しツアーのついでに僕もいくつか手に入れて、&lt;BR&gt;その中の一つ：福建青茶「&lt;STRONG&gt;白牙奇蘭&lt;/STRONG&gt;」&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;IMG src="http://episteme.wankuma.com/photo/hakugakiran.jpg"&gt;&lt;BR&gt;&lt;BR&gt;岩茶に仕立てたものもありますが、こいつはゆるく丸めたタイプ。&lt;BR&gt;福建の茶らしく、鉄観音あるいは黄金桂系の香味です。&lt;BR&gt;ぁー、ひっさしぶりに真面目に茶淹れた。ｳﾏｰ&lt;BR&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192634.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>なつやすみー</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/21/192487.aspx</link><pubDate>Sat, 21 Aug 2010 15:29:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/21/192487.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192487.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/21/192487.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192487.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192487.aspx</trackback:ping><description>&lt;P&gt;今日からεπιは夏休みです。&lt;/P&gt;
&lt;P&gt;ウチとこはまとめて一週間、なつやすみを好きに選べるです。&lt;BR&gt;ここんとこ何年も、Tech・Edに合わせてますけどね。&lt;BR&gt;&lt;BR&gt;なつやすみの間、どこぞに旅に出る予定もなく、&lt;STRONG&gt;てろてろ&lt;/STRONG&gt;とコード書いて遊んでんじゃないかな。&lt;BR&gt;※ 仕事のコードと遊びのコードは別モノです。仕事のコードは&lt;STRONG&gt;やんちゃ&lt;/STRONG&gt;が許されないのでつまんなーい。&lt;BR&gt;&lt;BR&gt;水曜からTech・Ed&amp;nbsp;始まるんでコーディング三昧、てほどではないけども、&lt;BR&gt;数日間は手を染め始めたOpenCLを&lt;STRONG&gt;こねこね&lt;/STRONG&gt;する予定。&lt;BR&gt;&amp;nbsp;いつか勉強会でお披露目したいとこなんだが、&lt;STRONG&gt;デモできない&lt;/STRONG&gt;のが辛いとこ。&lt;BR&gt;マンデルブロ集合を&lt;STRONG&gt;瞬間で描き切る&lt;/STRONG&gt;とこ、お見せしたいんですけどねー。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192487.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>もうすぐ Tech・Ed</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/18/192410.aspx</link><pubDate>Wed, 18 Aug 2010 19:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/18/192410.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192410.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/18/192410.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192410.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192410.aspx</trackback:ping><description>&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;ぼくらの夏祭り&lt;SPAN lang=EN-US&gt;: &lt;A href="http://www.microsoft.com/japan/teched/2010/default.aspx"&gt;Microsoft Tech&lt;/A&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;A href="http://www.microsoft.com/japan/teched/2010/default.aspx"&gt;&lt;FONT face=Arial&gt;・&lt;/FONT&gt;&lt;/A&gt;&lt;SPAN lang=EN-US&gt;&lt;A href="http://www.microsoft.com/japan/teched/2010/default.aspx"&gt;&lt;FONT face=Arial&gt;Ed 2010&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt; &lt;/FONT&gt;&lt;/SPAN&gt;&lt;FONT face=Arial&gt;まであと一週間と迫りました。旅支度は&lt;SPAN lang=EN-US&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;恙無く進んでおりますでしょうか。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;わんくま同盟の&lt;STRIKE&gt;見飽きた&lt;/STRIKE&gt;見慣れた連中は&lt;SPAN lang=EN-US&gt;BOF&lt;/SPAN&gt;と&lt;SPAN lang=EN-US&gt;Expert Talk&lt;/SPAN&gt;あたりに出没します。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;僕はっちゅーと今年は残念ながら&lt;SPAN lang=EN-US&gt;BOF&lt;/SPAN&gt;の出番ナシ。&lt;BR&gt;んだけどおそらくは&lt;SPAN lang=EN-US&gt;BOF&lt;/SPAN&gt;会場に顔出して粛々と進行するセッションを&lt;STRONG&gt;ひっかき回す&lt;/STRONG&gt;気マンマンでございますとも。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;僕の出番は&lt;SPAN lang=EN-US&gt;Expert Talk&lt;/SPAN&gt;っす。よーするに「&lt;STRONG&gt;よろず相談承り処&lt;/STRONG&gt;」ですね。&lt;SPAN lang=EN-US&gt;MS&lt;/SPAN&gt;のスタッフと&lt;SPAN lang=EN-US&gt;MVP&lt;/SPAN&gt;が皆さんの質問&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;相談にお答えしようって企画です。ここもえらく&lt;STRONG&gt;わんくま色&lt;/STRONG&gt;のこゆーい一角となってます。僕は初日&lt;SPAN lang=EN-US&gt;(8/25)15:20-16:55&lt;/SPAN&gt;と三日目&lt;SPAN lang=EN-US&gt;(8/27)13:45-1520&lt;/SPAN&gt;に座ってろってお達し。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;んなわけで御来場の皆さんよろしくどーぞ。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;んでもってついでに土曜日&lt;SPAN lang=EN-US&gt;(8/28)&lt;/SPAN&gt;は&lt;/FONT&gt;&lt;A href="http://www.wankuma.com/seminar/20100828yokohama03/Default.aspx"&gt;&lt;FONT face=Arial&gt;わんくま同盟横浜勉強会&lt;/FONT&gt;&lt;/A&gt;&lt;FONT face=Arial&gt;「&lt;SPAN lang=EN-US&gt;&lt;STRONG&gt;C++Day&lt;/STRONG&gt;&lt;/SPAN&gt;」です。今回もこゆーいネタを用意しましたですよー&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-FAMILY: 'Arial','sans-serif'; FONT-SIZE: 10.5pt; mso-bidi-font-size: 11.0pt; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 'ＭＳ ゴシック'; mso-fareast-theme-font: minor-fareast; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA" lang=EN-US&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192410.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>RADEON HD5670がいうこと聞いてくれないでござるの巻</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/16/192372.aspx</link><pubDate>Mon, 16 Aug 2010 23:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/16/192372.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192372.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/16/192372.aspx#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192372.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192372.aspx</trackback:ping><description>&lt;P&gt;んーむ、参ったね。&lt;/P&gt;
&lt;P&gt;OpenCL 1.1 を試すべく 最新ドライバ Catalyst 10.7 を突っ込んで、&lt;BR&gt;しばらくは快調に動いてくれてたんだけども、なにが哀しいのか&lt;BR&gt;困ったトラブル。使用中突然画面が固まったり暗転したり。&lt;/P&gt;
&lt;P&gt;ドライバ更新の際はinstall manager CCC をun-install するが無難&lt;BR&gt;とか風のうわさで聞いてやってみたけど解消せず。&lt;BR&gt;&lt;BR&gt;safe-modeでドライバ抜いてVGA互換モードでなら問題ないので、&lt;BR&gt;ハードがイカれたとは考えにくい。&lt;BR&gt;&lt;BR&gt;ショボいHD5450に差し替えて様子をみることにするつもりだけど...&lt;BR&gt;OpenCLさっくり動いちゃったのでゴキゲンだったのになー。しょんぼりさんです。&lt;BR&gt;もうちょい上位のになると補助給電せにゃならんので電源取り換えだし。&lt;BR&gt;てか今の電源がグラボ電源持ち合わせてないからコイツにしたのにのに。&lt;BR&gt;&lt;BR&gt;なんやわけわからんトラブルです。&lt;BR&gt;なんか情報あったら教えてくださいまし &amp;gt; ALL&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192372.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>OpenCL(6) コンパイル済バイナリをこしらえる</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/16/192365.aspx</link><pubDate>Mon, 16 Aug 2010 19:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/16/192365.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192365.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/16/192365.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192365.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192365.aspx</trackback:ping><description>&lt;P&gt;OpenCLではソースコードを文字列で与え、実行時にコンパイルしています。&lt;BR&gt;こうすることで、Platformが提供する各種デバイスに応じたProgramを用意できるわけですが、いかんせんコンパイル時間が&lt;STRONG&gt;MOTTAINAI&lt;/STRONG&gt;。デバイスを決め打ちにしていいならコンパイル済のBinary Kernelを直接ロードするんが手っ取り早いす。&lt;/P&gt;
&lt;P&gt;で、Binary Kernelのつくりかた。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://developer.amd.com/support/KnowledgeBase/Lists/KnowledgeBase/DispForm.aspx?ID=115"&gt;KB115 - ATI Stream SDK v2.2 Support for Binary OpenCL&amp;#8482; Kernels&lt;BR&gt;&lt;/A&gt;のキモんとこを解説。&lt;/P&gt;
&lt;P&gt;0. 前準備&lt;BR&gt;上記KB115ページに &lt;A href="http://developer.amd.com/Downloads/clbinary.zip"&gt;clbinary.zip&lt;/A&gt;&lt;BR&gt;があります。こいつを落っことして解凍し、clbinarygen.c, clbinaryuse.c を用意します。&lt;/P&gt;
&lt;P&gt;1. clbinarygen, clbinaryuse をコンパイルし、exeを作ります。&lt;BR&gt;vc10ならば:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; : build.bat&lt;BR&gt;&amp;nbsp; set INCDIR="%ATISTREAMSDKROOT%include"&lt;BR&gt;&amp;nbsp; set LIBDIR="%ATISTREAMSDKROOT%lib\x86"&lt;BR&gt;&amp;nbsp; cl -EHsc -I%INCDIR% %1 %2 %3 %4 %5 OpenCL.lib -link -libpath:%LIBDIR%&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;なんてなバッチからコンパイルすりゃえぇべ。&lt;/P&gt;
&lt;P&gt;2. カーネル・コードをコンパイルし、Kernel Binaryを作ります。&lt;BR&gt;カーネル・コード ほげほげ.cl を kernel.cl にコピーし、clbinarygen を起動すると:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;gt;&lt;FONT color=#0000ff&gt;clbinarygen&lt;/FONT&gt;&lt;BR&gt;Reading in program from kernel.cl&lt;BR&gt;Number of platforms found: 1&lt;BR&gt;Found AMD platform&lt;BR&gt;Number of devices found: 10&lt;BR&gt;DEVICE[0]: CL_DEVICE_TYPE_CPU, Name=AMD Athlon(tm) 64 X2 Dual Core Processor 4400+&lt;BR&gt;DEVICE[1]: CL_DEVICE_TYPE_GPU, Name=Redwood&lt;BR&gt;DEVICE[2]: CL_DEVICE_TYPE_GPU, Name=ATI RV770&lt;BR&gt;DEVICE[3]: CL_DEVICE_TYPE_GPU, Name=ATI RV770&lt;BR&gt;DEVICE[4]: CL_DEVICE_TYPE_GPU, Name=ATI RV710&lt;BR&gt;DEVICE[5]: CL_DEVICE_TYPE_GPU, Name=ATI RV730&lt;BR&gt;DEVICE[6]: CL_DEVICE_TYPE_GPU, Name=Cypress&lt;BR&gt;DEVICE[7]: CL_DEVICE_TYPE_GPU, Name=Juniper&lt;BR&gt;DEVICE[8]: CL_DEVICE_TYPE_GPU, Name=Redwood&lt;BR&gt;DEVICE[9]: CL_DEVICE_TYPE_GPU, Name=Cedar&lt;BR&gt;Writing out binary kernel to kernel.bin.0&lt;BR&gt;Writing out binary kernel to kernel.bin.1&lt;BR&gt;Writing out binary kernel to kernel.bin.2&lt;BR&gt;Writing out binary kernel to kernel.bin.3&lt;BR&gt;Writing out binary kernel to kernel.bin.4&lt;BR&gt;Writing out binary kernel to kernel.bin.5&lt;BR&gt;Writing out binary kernel to kernel.bin.6&lt;BR&gt;Writing out binary kernel to kernel.bin.7&lt;BR&gt;Writing out binary kernel to kernel.bin.8&lt;BR&gt;Writing out binary kernel to kernel.bin.9&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;こんなん出ました。各Device対応に kernel.bin.xxx が生成されます。僕のRADEON HD5670 のDevice名は Redwood だから kernel.bin.1 か kernel.bin.8 を使えばいいみたいよ。&lt;/P&gt;
&lt;P&gt;3. できあがったBinary Kernelはそのまんま使えるみたいだけど、そこそこデカいので不要なデータをさっぴいて小さくします。&lt;/P&gt;
&lt;P&gt;Binary Kernelの要らんとこをそぎ落として小さくするにはLinux由来のツール: readelf, objcopy が必要となります。僕はWindowsのヒトなのでCygwinをインストールしておきます。そんときDevelカテゴリのbinutilsパッケージをお忘れなく。この中にreadelf,objcopyがありますでの。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;gt;&lt;FONT color=#0000ff&gt;c:\cygwin\bin\readelf -aW kernel.bin.1 | c:\cygwin\bin\grep Machine&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; Machine:&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;lt;unknown&amp;gt;: 0x3f3&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;こんなん出ました。ケツにある１６進: 0x3f3 が大事。&lt;/P&gt;
&lt;P&gt;んでは要らん部分をそぎ落とします。&lt;/P&gt;
&lt;P&gt;32bit:&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;objcopy -I elf32-i386 -O elf32-i386 -R .source -R .livmir -R .amdil --alt-machine-code=&amp;lt;さっきの１６進コード&amp;gt; &amp;lt;Kernel Binary名&amp;gt; &amp;lt;できあがり&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;64bit:&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .livmir -R .amdil --alt-machine-code=&amp;lt;さっきの１６進コード&amp;gt; &amp;lt;Kernel Binary名&amp;gt; &amp;lt;できあがり&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;僕んトコだと:&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;gt;&lt;FONT color=#0000ff&gt;c:\cygwin\bin\objcopy -I elf32-i386 -O elf32-i386 -R .source -R .livmir -R .amdil --alt-machine-code=0x3f3 kernel.bin.1 stripped_kernel.bin&lt;BR&gt;&lt;/FONT&gt;/usr/bin/objcopy: this target does not support 1011 alternative machine codes&lt;BR&gt;/usr/bin/objcopy: treating that number as an absolute e_machine value instead&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;なんかゆってるけどひとまず気にしないｗｗ&lt;/P&gt;
&lt;P&gt;4. できあがったstripped_kernel.binが使えることを確認します。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;gt;&lt;FONT color=#0000ff&gt;clbinaryuse&lt;/FONT&gt;&lt;BR&gt;Number of platforms found: 1&lt;BR&gt;Found AMD platform&lt;BR&gt;Number of devices found: 2&lt;BR&gt;DEVICE[0]: CL_DEVICE_TYPE_CPU, Name=AMD Athlon(tm) 64 X2 Dual Core Processor 4400+&lt;BR&gt;DEVICE[1]: CL_DEVICE_TYPE_GPU, Name=Redwood&lt;BR&gt;Which device do you want to use? [0-1]?&lt;BR&gt;&lt;FONT color=#0000ff&gt;1&lt;BR&gt;&lt;/FONT&gt;Enter filename of corresponding binary kernel file&lt;BR&gt;&lt;FONT color=#0000ff&gt;stripped_kernel.bin&lt;/FONT&gt;&lt;BR&gt;Reading in binary kernel from stripped_kernel.bin&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;*** REPLACE THIS WITH ACTUAL WORK ***&lt;BR&gt;&lt;/FONT&gt;↑コレが見えたらできあがり。&lt;/P&gt;
&lt;P&gt;このバイナリ・ファイルを読み込むには:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Context context;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;cl::Device&amp;gt; devices;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;char&amp;gt; binary;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ifstream stream("&lt;FONT color=#0000ff&gt;stripped_kernel.bin&lt;/FONT&gt;", ios::binary);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( !stream.is_open() ) { return 0; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; istreambuf_iterator&amp;lt;char&amp;gt; first(stream);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; istreambuf_iterator&amp;lt;char&amp;gt; last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; copy(first, last, back_inserter(binary));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Program::Binaries binaries;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; binaries.push_back(make_pair(static_cast&amp;lt;void*&amp;gt;(&amp;amp;binary[0]),binary.size()));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Program program(context,devices,binaries);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;とかなんとか。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192365.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>OpenCL(5) まけるもんかとマンデルブロ</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/14/192324.aspx</link><pubDate>Sat, 14 Aug 2010 12:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/14/192324.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192324.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/14/192324.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192324.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192324.aspx</trackback:ping><description>&lt;P&gt;前回の奇遇転置ソートでは&lt;STRONG&gt;トホホ&lt;/STRONG&gt;な結果となりました。&lt;BR&gt;&lt;BR&gt;あまりに悔しいので&lt;A href="http://codezine.jp/article/detail/4650"&gt;マンデルブロ集合&lt;/A&gt;に挑戦。&lt;BR&gt;マンデルブロ集合は&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;int getCalcNum(const float x, const float y, const int max_calc)　{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp; count = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float prevX = 0.0f;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float prevY = 0.0f;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 0; i &amp;lt; max_calc + 1; i++) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; count = i + 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float newX = (prevX * prevX) - (prevY * prevY) + x; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float newY = (2.0f * prevX * prevY) + y;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (((newX * newX) + (newY * newY)) &amp;gt; 4.0f) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 発散する&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prevX = newX;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; prevY = newY;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return count;&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;こんな計算を各ピクセルに対して行います。&lt;BR&gt;Kernelに計算範囲と結果格納領域を与えて起動すれば、&lt;BR&gt;あとはホストとのやり取りなしに全領域を計算して返ってくるよに仕向けました。&lt;BR&gt;↑の計算を512x512点、max_calc=512　でぶん回してみた。&lt;BR&gt;&lt;BR&gt;結果: &lt;BR&gt;&lt;FONT size=4&gt;single-thread@CPU : 180[ms]　（AMD Athlon64 X2 4400+)&lt;BR&gt;OpenCL : &lt;FONT color=#ff0000&gt;15&lt;/FONT&gt;[ms]　(ATi RADEON HD5670)&lt;BR&gt;&lt;/FONT&gt;&lt;STRONG&gt;こぉでなくちゃ&lt;/STRONG&gt;だわ。&lt;BR&gt;&lt;BR&gt;時間計測にはおちゃらかにGetTickCount()使こうたんで精度は&lt;STRONG&gt;めちゃﾃｷﾄｰ&lt;/STRONG&gt;ですが、&lt;BR&gt;こんくらいのパフォーマンスは叩き出せるですね。GPGPUは&lt;STRONG&gt;やればできる子&lt;/STRONG&gt;。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192324.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>OpenCL(4) ここまでのまとめ</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/13/192305.aspx</link><pubDate>Fri, 13 Aug 2010 23:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/13/192305.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192305.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/13/192305.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192305.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192305.aspx</trackback:ping><description>&lt;P&gt;ここ数日でOpenCLについて学んだこと。&lt;/P&gt;
&lt;P&gt;- 各ベンダはOpenCLの&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;&lt;STRONG&gt;Platform&lt;/STRONG&gt;&lt;/FONT&gt;を提供する。&lt;BR&gt;- &lt;STRONG&gt;&lt;FONT face="Courier New"&gt;Platform&lt;/FONT&gt;&lt;/STRONG&gt;はひとつ以上の&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;&lt;STRONG&gt;Device&lt;/STRONG&gt;&lt;/FONT&gt;を持つ。&lt;BR&gt;- 特定の&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;Device&lt;/FONT&gt;&lt;/STRONG&gt;で実行する環境を&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;Context&lt;/FONT&gt;&lt;/STRONG&gt;という。&lt;BR&gt;- &lt;STRONG&gt;&lt;FONT face="Courier New"&gt;Device&lt;/FONT&gt;&lt;/STRONG&gt;に与える(OpenCL Cで書かれた)&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;Program&lt;/FONT&gt;&lt;/STRONG&gt;はひとつ以上のエントリ(関数の入り口)を持つ。&lt;BR&gt;- ひとつのエントリとそれに与える引数のセットを&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;&lt;STRONG&gt;Kernel&lt;/STRONG&gt;&lt;/FONT&gt;という。&lt;BR&gt;- &lt;STRONG&gt;&lt;FONT face="Courier New"&gt;Device&lt;/FONT&gt;&lt;/STRONG&gt;内の&lt;STRONG&gt;&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;Buffer&lt;/FONT&gt;&lt;/STRONG&gt;(メモリ領域)への読み書き、&lt;BR&gt;　そして&lt;STRONG&gt;&lt;FONT face="Courier New"&gt;Kernel&lt;/FONT&gt;&lt;/STRONG&gt;による実行などを&lt;FONT color=#ff0000 size=4 face="Courier New"&gt;&lt;STRONG&gt;CommandQueue&lt;/STRONG&gt;&lt;/FONT&gt;を介して行う。&lt;BR&gt;&lt;BR&gt;これらを踏まえてこしらえた習作、お題は「&lt;FONT color=#0000ff&gt;&lt;A href="http://blogs.wankuma.com/episteme/archive/2010/06/22/190465.aspx"&gt;並列処理が向かないかもしれない例&lt;/A&gt;&lt;/FONT&gt;」の奇遇転置ソート:&lt;BR&gt;&lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#808080&gt;&lt;FONT size=2&gt;1 7 6 5 8 2 4 3 があったとき、&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#808080&gt;&lt;FONT size=2&gt;[1] ふたつずつのペアをつくる。&lt;U&gt;1 7&lt;/U&gt; &lt;U&gt;6 5&lt;/U&gt; &lt;U&gt;8 2&lt;/U&gt; &lt;U&gt;4 3&lt;/U&gt; &lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;[2] それぞれのペアについて必要なら入れ替え &lt;U&gt;1 7&lt;/U&gt; &lt;U&gt;5 6&lt;/U&gt; &lt;U&gt;2 8&lt;/U&gt; &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;&lt;FONT color=#808080&gt;&lt;U&gt;3 4&lt;BR&gt;&lt;/U&gt;[3] ひとつずらしてペアをつくる 1 &lt;U&gt;7 5&lt;/U&gt; &lt;U&gt;6 2&lt;/U&gt; &lt;U&gt;8 3&lt;/U&gt; 4&lt;BR&gt;[4] それぞれのペアについて必要なら入れ替え1 &lt;U&gt;5 7&lt;/U&gt; &lt;U&gt;2 6&lt;/U&gt; &lt;U&gt;3 8&lt;/U&gt; 4&lt;BR&gt;[5] [1]～[4] をくりかえし。&lt;BR&gt;&lt;BR&gt;[2],[4] の際、ペアの入れ替えは&lt;STRONG&gt;互いに独立&lt;/STRONG&gt;だから並行処理できんぢゃん、と。&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;なんたってGPUですからね、コアはたっぷりあります。&lt;BR&gt;目下愛用のRADEON HD5670、シェーダ・プロセッサを400基載せてます。&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;#include &amp;lt;iostream&amp;gt;&amp;nbsp; // cout, endl&lt;BR&gt;#include &amp;lt;array&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // array&lt;BR&gt;#include &amp;lt;vector&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // vector&lt;BR&gt;#include &amp;lt;map&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // map&lt;BR&gt;#include &amp;lt;string&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // string&lt;BR&gt;#include &amp;lt;numeric&amp;gt;&amp;nbsp;&amp;nbsp; // iota&lt;BR&gt;#include &amp;lt;algorithm&amp;gt; // copy, for_each&lt;BR&gt;#include &amp;lt;iterator&amp;gt;&amp;nbsp; // back_inserter&lt;BR&gt;#include &amp;lt;utility&amp;gt;&amp;nbsp;&amp;nbsp; // make_pair&lt;BR&gt;#include &amp;lt;cassert&amp;gt;&amp;nbsp;&amp;nbsp; // assert&lt;BR&gt;#include &amp;lt;Windows.h&amp;gt; // GetTickCount&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;// error時は例外処理に一任する&lt;BR&gt;#define __CL_ENABLE_EXCEPTIONS&lt;BR&gt;#include &amp;lt;CL/cl.hpp&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;using namespace std;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int main() {&lt;BR&gt;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Platformを列挙し、ひとつ目を使う&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;cl::Platform&amp;gt; platforms;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Platform::get(&amp;amp;platforms);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; assert( !platforms.empty() );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Platform platform = platforms[0];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "Platform: " &amp;lt;&amp;lt; platform.getInfo&amp;lt;CL_PLATFORM_NAME&amp;gt;() &amp;lt;&amp;lt; '\t';&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 最初に見つかったPlatformからデバイスを探し、GPU-Contextを生成&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl_context_properties cprops[3] = { CL_CONTEXT_PLATFORM,(cl_context_properties)platform(), 0};&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Context context(CL_DEVICE_TYPE_GPU,cprops);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Context中のDeviceを列挙し、ひとつ目を使う&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;cl::Device&amp;gt; devices = context.getInfo&amp;lt;CL_CONTEXT_DEVICES&amp;gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; assert( !devices.empty() );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Device device = devices[0];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "Device: " &amp;lt;&amp;lt; device.getInfo&amp;lt;CL_DEVICE_NAME&amp;gt;() &amp;lt;&amp;lt; endl;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DeviceにCommandQueueを用意&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::CommandQueue queue(context,device);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Programを準備 : 奇遇ソート&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static string source_strs[] = {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;"__kernel void swap_even( \n"&lt;BR&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; __global float* data, \n"&lt;BR&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; __global int*&amp;nbsp;&amp;nbsp; swapped) \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "{ \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; int i = get_global_id(0); \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; int j = i + 1; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; if ( !(i &amp;amp; 1) ) { \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( data[i] &amp;gt; data[j] ) { \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float tmp = data[i]; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[i] = data[j]; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[j] = tmp; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *swapped = 1; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp; } \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; } \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "} \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "__kernel void swap_odd( \n"&lt;BR&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; __global float* data, \n"&lt;BR&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; __global int*&amp;nbsp;&amp;nbsp; swapped) \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "{ \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; int i = get_global_id(0); \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; int j = i + 1; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; if ( (i &amp;amp; 1) ) { \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( data[i] &amp;gt; data[j] ) { \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float tmp = data[i]; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[i] = data[j]; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[j] = tmp; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *swapped = 1; \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp;&amp;nbsp;&amp;nbsp; } \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;nbsp; } \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "} \n"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Program::Sources sources;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( string* str = source_strs; !str-&amp;gt;empty(); ++str ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sources.push_back(make_pair(str-&amp;gt;c_str(), str-&amp;gt;size()));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Programのビルド(失敗時にはログを出力)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Program program(context, sources);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; program.build(devices);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch ( cl::Error&amp;amp; ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cerr &amp;lt;&amp;lt; program.getBuildInfo&amp;lt;CL_PROGRAM_BUILD_LOG&amp;gt;(device) &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ProgramからKernelを生成&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; map&amp;lt;string,cl::Kernel&amp;gt; kernels;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vector&amp;lt;cl::Kernel&amp;gt; knls;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; program.createKernels(&amp;amp;knls);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 関数名とKernelとの対応表をつくる&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for_each(knls.begin(),knls.end(),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&amp;amp;](cl::Kernel k) { kernels[k.getInfo&amp;lt;CL_KERNEL_FUNCTION_NAME&amp;gt;()] = k; });&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ホストに要素数Nの配列を用意&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int N = 10000;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; array&amp;lt;float,N&amp;gt; data;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int swapped;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // data[] = { N-1, N-2, ... 2, 1 }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iota(data.begin(), data.end(), 1.0f);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reverse(data.begin(),data.end());&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ふつーにやればこんなの。&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD t = GetTickCount();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( int i = 0; i &amp;lt; N-1; i += 2 ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( data[i] &amp;gt; data[i+1] ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float tmp = data[i]; data[i] = data[i+1]; data[i+1] = tmp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( int i = 1; i &amp;lt; N-1; i += 2 ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( data[i] &amp;gt; data[i+1] ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float tmp = data[i]; data[i] = data[i+1]; data[i+1] = tmp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while ( swapped );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = GetTickCount() - t;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; assert( is_sorted(data.begin(), data.end()) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( is_sorted(data.begin(),data.end()) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "CPU DONE. " &amp;lt;&amp;lt; t &amp;lt;&amp;lt; "[ms]" &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reverse(data.begin(),data.end());&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Device側にバッファを確保&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Buffer buffer_data(context,&amp;nbsp;&amp;nbsp;&amp;nbsp; CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,&lt;BR&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; sizeof(data)&amp;nbsp;&amp;nbsp; , &amp;amp;data[0]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Buffer buffer_swapped(context, CL_MEM_WRITE_ONLY,&lt;BR&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; sizeof(swapped), nullptr);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 2つのKernelに引数を設定&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Kernel kernel_0 = kernels["swap_even"];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kernel_0.setArg(0,buffer_data);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kernel_0.setArg(1,buffer_swapped);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cl::Kernel kernel_1 = kernels["swap_odd"];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kernel_1.setArg(0,buffer_data);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kernel_1.setArg(1,buffer_swapped);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = GetTickCount();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;do {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // swappedを0(false)に&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; swapped = 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueWriteBuffer(buffer_swapped,CL_TRUE, 0, sizeof(swapped), &amp;amp;swapped);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 偶数&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueNDRangeKernel(kernel_0, cl::NullRange, cl::NDRange(N-1), cl::NullRange);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueBarrier();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 奇数&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueNDRangeKernel(kernel_1, cl::NullRange, cl::NDRange(N-1), cl::NullRange);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueBarrier();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // swappedを取り出し&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueReadBuffer(buffer_swapped, CL_TRUE, 0, sizeof(swapped), &amp;amp;swapped);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while ( swapped );&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; t = GetTickCount() - t;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 結果を取り出して検証&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; queue.enqueueReadBuffer(buffer_data, true, 0, sizeof(data), &amp;amp;data[0]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; assert( is_sorted(data.begin(), data.end()) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( is_sorted(data.begin(), data.end()) ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; "GPU DONE. " &amp;lt;&amp;lt; t &amp;lt;&amp;lt; "[ms] " &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; } catch ( cl::Error&amp;amp; ex ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cerr &amp;lt;&amp;lt; ex.err() &amp;lt;&amp;lt; ':' &amp;lt;&amp;lt; ex.what() &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;実行結果:&lt;BR&gt;&lt;FONT face="Courier New"&gt;Platform: ATI Stream&amp;nbsp;&amp;nbsp;&amp;nbsp; Device: Redwood&lt;BR&gt;CPU DONE. 156[ms]&lt;BR&gt;GPU DONE. &lt;FONT color=#ff0000&gt;2886&lt;/FONT&gt;[ms]&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;あ、あるえぇぇ...? &lt;STRONG&gt;ぜんっぜん&lt;/STRONG&gt;速くねぇ。&lt;BR&gt;&lt;FONT color=#ff0000&gt;赤いトコ&lt;/FONT&gt;がGPU内でチョー並列に動いてはくれるんだけども、&lt;BR&gt;それを呼んでる&lt;FONT color=#0000ff&gt;青いトコ&lt;/FONT&gt;はホスト側にあります。&lt;BR&gt;青いトコは並列でもなんでもなく、赤いトコがいっくら速くても&lt;BR&gt;青いトコがそれを&lt;STRONG&gt;相殺&lt;/STRONG&gt;してるように思えます。&lt;/P&gt;
&lt;P&gt;GPGPUでかっとびアプリを書くにはまだまだ&lt;STRONG&gt;修行が足らん&lt;/STRONG&gt;なーと。&lt;BR&gt;まぁ二、三日でここまで書けるよになったんだから僕の感覚もそんなに鈍っちゃいないぜ、と。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192305.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>OpenCL(3) ATI Stream SDK v2.2</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/12/192278.aspx</link><pubDate>Thu, 12 Aug 2010 22:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/12/192278.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192278.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/12/192278.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192278.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192278.aspx</trackback:ping><description>&lt;P&gt;あらま早々にSDKのupgrade.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://developer.amd.com/gpu/ATIStreamSDK/Pages/default.aspx"&gt;ATI Stream Software Development Kit (SDK) v2.2&lt;/A&gt;&lt;BR&gt;&lt;BR&gt;大きな変更点(What's New? より抜粋):&lt;BR&gt;- OpenCL 1.1 サポート&lt;BR&gt;- Visual Studio 2010 に対応 (残念ながらExpress.edはだめポ)&lt;BR&gt;- &lt;FONT face="Courier New"&gt;&lt;STRONG&gt;double&lt;/STRONG&gt;&lt;/FONT&gt;型 サポート　(&lt;FONT size=2 face="Courier New"&gt;#pragma OPENCL EXTENSION cl_amd_fp64 : enable&lt;/FONT&gt; がおまぢない)&lt;BR&gt;- debug用に &lt;FONT face="Courier New"&gt;&lt;STRONG&gt;printf&lt;/STRONG&gt;&lt;/FONT&gt; できる(&lt;FONT size=2 face="Courier New"&gt;#pragma OPENCL EXTENSION cl_amd_printf : enable&lt;/FONT&gt;)&lt;BR&gt;などなど。&lt;BR&gt;&lt;BR&gt;早速落っことしてサンプルを試してるとこっす。VS10用のsolutionがついてました。&lt;BR&gt;&lt;BR&gt;# 対応ドライバは &lt;A href="http://support.amd.com/us/kbarticles/Pages/OpenCL11ATICat107UpdateDriver.aspx"&gt;Catalyst 10.7&lt;/A&gt; です。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192278.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>Observerネタを書きました。ついでに横浜勉強会へのお誘い。</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/10/192208.aspx</link><pubDate>Tue, 10 Aug 2010 19:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/10/192208.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192208.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/10/192208.aspx#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192208.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192208.aspx</trackback:ping><description>&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;CodeZine&lt;/SPAN&gt;です、はい。&lt;SPAN lang=EN-US&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;A href="http://codezine.jp/article/detail/5327"&gt;&lt;SPAN lang=EN-US&gt;shared_ptr&lt;/SPAN&gt;による&lt;SPAN lang=EN-US&gt;Observer&lt;/SPAN&gt;パターンの実装&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;A href="http://codezine.jp/article/detail/5327"&gt;&lt;FONT face=Arial&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;FONT face=Arial&gt;お馴染み&lt;SPAN lang=EN-US&gt;Observer&lt;/SPAN&gt;パターンです。要は&lt;SPAN lang=EN-US&gt;Callback&lt;/SPAN&gt;すよ。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;Observer&lt;/SPAN&gt;の歴史は古く、織田信長が長引く戦に疲弊し、矢の飛び交う中&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;「わしはちょっと寝る。なにかあったら起こせ」&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;と臣下に伝え馬上で熟睡したとの記録が残っており、&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;馬上で眠る信長公の姿を模した木彫りの馬: 御武座馬(おぶざば)&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;は郷土玩具として有名ですね。&lt;SPAN lang=EN-US&gt;(&lt;/SPAN&gt;&lt;STRONG&gt;うっそぴょーん&lt;/STRONG&gt;&lt;SPAN lang=EN-US&gt;)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;Observer&lt;/SPAN&gt;パターンに起こる問題のひとつが、&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;「起こそうとしたお館様が冷たくなってたらどーすんの&lt;SPAN lang=EN-US&gt;?&lt;/SPAN&gt;」&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;.NET/Java&lt;/SPAN&gt;では強参照、つまり「&lt;STRONG&gt;死なさへんでぇ&lt;/STRONG&gt;」と。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;C++&lt;/SPAN&gt;では参照カウントを使って死なさんこともできますし、&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;弱参照を使えば&lt;STRONG&gt;死んでもだいぢょぶ&lt;/STRONG&gt;な実装もできるよ。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;ってなことを書いてます。&lt;STRONG&gt;コードたっぷり&lt;/STRONG&gt;です。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;ぢつは、このお話もう一本のルートがありましてですね。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;.NET&lt;/SPAN&gt;では&lt;SPAN lang=EN-US&gt;delegate/event&lt;/SPAN&gt;ってゆーナイスなからくりが&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;Observer&lt;/SPAN&gt;パターンの利用を自由なものにしてくれました。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;delegate&lt;/SPAN&gt;のおかげで特定のクラス&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;インタフェースから継承&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;実装&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;しなければ信長になれないってゆー縛りから解放されます。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;さて、&lt;SPAN lang=EN-US&gt;C++0X&lt;/SPAN&gt;では新たに&lt;SPAN lang=EN-US&gt;lambda&lt;/SPAN&gt;が導入されました。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;この&lt;SPAN lang=EN-US&gt;lambda&lt;/SPAN&gt;を使って&lt;STRONG&gt;&lt;SPAN lang=EN-US&gt;delegate/event&lt;/SPAN&gt;の真似ごと&lt;/STRONG&gt;ができるはず。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;どんな手管で&lt;SPAN lang=EN-US&gt;delegate/event&lt;/SPAN&gt;っポいものを作るか&lt;SPAN lang=EN-US&gt;...&lt;/SPAN&gt;知りたくね&lt;SPAN lang=EN-US&gt;?&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;&lt;A href="http://www.wankuma.com/seminar/20100828yokohama03/Default.aspx"&gt;わんくま横浜勉強会&lt;/A&gt;&lt;/STRONG&gt;にいらっしゃいませ(ﾎﾎﾎ)。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;STRONG&gt;マンガ本&lt;/STRONG&gt;とか&lt;STRONG&gt;魔導書&lt;/STRONG&gt;とか&lt;STRONG&gt;怪しげなカード&lt;/STRONG&gt;とかもありますよー&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192208.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>OpenCL(2) ...はじまったかもしれない</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/10/192179.aspx</link><pubDate>Tue, 10 Aug 2010 00:06:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/10/192179.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192179.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/10/192179.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192179.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192179.aspx</trackback:ping><description>&lt;P&gt;&lt;A id=viewpost.ascx_TitleUrl href="/episteme/archive/2010/08/08/192153.aspx"&gt;&lt;FONT color=#0000ff&gt;なんとなくOpenCLなるものを&lt;/FONT&gt;&lt;/A&gt; の続き。&lt;BR&gt;&lt;BR&gt;そゆわけで、入門書を読みつつ第三章「OpenCLプログラム作成手順」に従って&lt;BR&gt;サンプル・コードを打ち込んでたわけです。&lt;BR&gt;版社のサポート・ページから掲載コードぜんぶ拾ってこれるんだけども、&lt;BR&gt;最初はちまちま手打ちして開発スタイルを腕に覚えさすですよ。&lt;BR&gt;&lt;BR&gt;サンプル・コードはなんとも素直なCなので難しくはないんだけども...&lt;STRONG&gt;長い&lt;/STRONG&gt;。&lt;BR&gt;二つの float 配列を足す: out[i] = in1[i] + in2[i] をやらすだけのことに&lt;STRONG&gt;400行&lt;/STRONG&gt;。&lt;BR&gt;毎回これじゃかなわんなー、なんぞ賢いやり方ないものかとATIやOpenCLの&lt;BR&gt;本家クロノスにある資料を眺めてたですよ。&lt;BR&gt;&lt;BR&gt;...みつけましたぜダンナ、クロノスの&lt;A href="http://www.khronos.org/registry/cl/"&gt;OpenCLドキュメント集&lt;/A&gt;の中に&lt;BR&gt;&lt;STRONG&gt;OpenCL 1.1 C++ Bindings &lt;/STRONG&gt;&lt;A href="http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.1.pdf"&gt;&lt;STRONG&gt;Specification&lt;/STRONG&gt; &lt;/A&gt;なんちゅーのがあるやないのん。&lt;BR&gt;&lt;BR&gt;んむ、どうやらCで提供されたOpenCL-APIにクラスの薄皮を被せたwrapperとミタ。&lt;BR&gt;そんじゃってんで ATI Stream SDK の include-dir. 覗いたらアナタ、ちゃんと入ってるぢゃあァりませんか♪&lt;BR&gt;&lt;BR&gt;こいつを使って書き換えてみたらまぁ、なんということでしょう。&lt;STRONG&gt;400行が80行にっ!&lt;/STRONG&gt;&lt;BR&gt;おちゃらか超並列コンピューティングなら&amp;nbsp;OpenCL&amp;nbsp;C++binding でキマリだぜぃ!&lt;BR&gt;&lt;BR&gt;# ここらへん、.NETはどんなアプローチなのかしら。 &lt;BR&gt;# DirectCompute とやらの .NET-interface を提供すんのかしら。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192179.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>なんとなくOpenCLなるものを</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/08/192153.aspx</link><pubDate>Sun, 08 Aug 2010 23:41:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/08/192153.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192153.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/08/192153.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192153.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192153.aspx</trackback:ping><description>&lt;P&gt;お散歩がてら横浜近くの本屋さん:有隣堂＠関内をぶらついてきました。&lt;BR&gt;# ココは文具の品ぞろえもよろしく、お気に入りです。&lt;/P&gt;
&lt;P&gt;なんとはなしに買ってきた「&lt;A href="http://astore.amazon.co.jp/episteme00-22/detail/4798026085"&gt;OpenCL入門&lt;/A&gt;」←&lt;STRONG&gt;衝動買い&lt;/STRONG&gt;っす。&lt;BR&gt;&lt;BR&gt;いやね、お友達から「CUDAやんね?」ってお誘いを受け、グラボ(GeForce9800GTS)まで借りてたですよ。&lt;BR&gt;ところがそのグラボ、&lt;STRONG&gt;こんがり&lt;/STRONG&gt;焼けちゃいまして。&lt;BR&gt;かわりに買ったのが&lt;A href="http://astore.amazon.co.jp/episteme00-22/detail/B0034UB0RU"&gt;RADEON　HD5670積んだやつ&lt;/A&gt;。能力的には&lt;STRONG&gt;とんとん&lt;/STRONG&gt;かな体感では。&lt;BR&gt;&lt;BR&gt;結局CUDAに触ることなくNVIDIAからATIに転んだわけで、&lt;BR&gt;CUDAのお誘いに乗ることができず少なからず負い目を感じておったわけっす。&lt;BR&gt;&lt;BR&gt;その罪滅ぼし、てーことでもないけどOpenCLならCUDA/ATI-streamを包含すっからちぃとは&lt;STRONG&gt;言い訳&lt;/STRONG&gt;もたつんでないかと。&lt;BR&gt;それにGPGPU絡みはCUDAが先行してたんでATIユーザには情報がまだ少ないポ。&lt;BR&gt;僕が触ればちっとはお役に立てんでないかと。&lt;BR&gt;&lt;BR&gt;まずは OpenCL 開発前準備 (ATIのグラボ持ってる人向け)&lt;BR&gt;&lt;BR&gt;1. ATI Stream のSDK入手とinstall&lt;BR&gt;　AMDのサイト: &lt;A href="http://developer.amd.com/gpu/ATIStreamSDK/Pages/default.aspx"&gt;ATI Stream Software Development Kit (SDK) v2.1&lt;/A&gt;&amp;nbsp;から SDKを拾ってくる。&lt;BR&gt;　各種環境に合わせたSDKがあるんでﾃｹﾄｰに選んでくだち。&lt;BR&gt;　僕は Vista/Win7版の32bit/64bitの両方落としといたです。&lt;BR&gt;　開発環境はVS2008となってますがVS2010でも問題なさげ。&lt;BR&gt;　ATI Streamで遊べるGPUリストもこのページに載ってるんでざっくし確認するがよいー(RADEON　HD4xxx/5xxxなら大抵OKみたいです)。&lt;BR&gt;　インストールはインストーラが上がってくれるんで[次へ]ボタンを突っついただけです。&lt;BR&gt;&lt;BR&gt;2. コンパイル・オプションを調べる&lt;BR&gt;　SDKに同梱されてたサンプル・ソリューションを開き、いくつかbuild/実行して動くのを確認。&lt;BR&gt;　しかるのちやおらプロジェクト・プロパティ&lt;STRONG&gt;こじあけて&lt;/STRONG&gt;コンパイル・オプションを眺める。&lt;BR&gt;　いやさ、いちいちVS立ち上げるよかテキストエディタとコマンドライン・コンパイラで&lt;STRONG&gt;ちまちま&lt;/STRONG&gt;&lt;BR&gt;　いぢりたいこともあるんでね。&lt;BR&gt;　...どうやらSDKインストールした時点で環境変数 &lt;STRONG&gt;&lt;FONT face="Courier New"&gt;ATISTREAMSDKROOT&lt;/FONT&gt;&lt;/STRONG&gt; が定義されたみたい。&lt;BR&gt;　ここらへんの情報を基に build.bat をこしらえた:&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; set INCDIR="%ATISTREAMSDKROOT%include"&lt;BR&gt;&amp;nbsp; set LIBDIR="%ATISTREAMSDKROOT%lib\x86"&lt;BR&gt;&amp;nbsp; cl -EHsc -I%INCDIR% %1 %2 %3 %4 %5 OpenCL.lib -link -libpath:%LIBDIR%&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;　こんなのをテキトーに掘ったディレクトリ &lt;FONT face="Courier New"&gt;d:\work\OpenCL&lt;/FONT&gt; に置く。&lt;BR&gt;&lt;BR&gt;3. おためし&lt;BR&gt;　買ってきた「OpenCL入門」の&lt;A href="http://www.shuwasystem.co.jp/support/7980html/2608.html"&gt;サポートページ&lt;/A&gt;からサンプルをひろって解凍。いっちゃん最初のサンプル main.cpp をさっきのディレクトリにコピっていきなりbuildを試みる。&lt;BR&gt;&lt;BR&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#808080&gt;d:\Work\OpenCL&amp;gt;&lt;/FONT&gt;build main.cpp&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#808080&gt;d:\Work\OpenCL&amp;gt;&lt;/FONT&gt;set INCDIR="C:\Program Files (x86)\ATI Stream\include"&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#808080&gt;d:\Work\OpenCL&amp;gt;&lt;/FONT&gt;set LIBDIR="C:\Program Files (x86)\ATI Stream\lib\x86"&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#808080&gt;d:\Work\OpenCL&amp;gt;&lt;/FONT&gt;cl -EHsc -I"C:\Program Files (x86)\ATI Stream\include" main.cpp&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OpenCL.lib -link -libpath:"C:\Program Files (x86)\ATI Stream\lib\x86"&lt;BR&gt;Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86&lt;BR&gt;Copyright (C) Microsoft Corporation.&amp;nbsp; All rights reserved.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;main.cpp&lt;BR&gt;Microsoft (R) Incremental Linker Version 10.00.30319.01&lt;BR&gt;Copyright (C) Microsoft Corporation.&amp;nbsp; All rights reserved.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;/out:main.exe&lt;BR&gt;"-libpath:C:\Program Files (x86)\ATI Stream\lib\x86"&lt;BR&gt;main.obj&lt;BR&gt;OpenCL.lib&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;　なんかできたよ。実行してみっか:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;FONT color=#808080&gt;d:\Work\OpenCL&amp;gt;&lt;/FONT&gt;main&lt;BR&gt;Number of platform(s) : 1&lt;BR&gt;Platform profile&amp;nbsp;&amp;nbsp; : FULL_PROFILE&lt;BR&gt;Platform version&amp;nbsp;&amp;nbsp; : OpenCL 1.0 ATI-Stream-v2.1 (145)&lt;BR&gt;Platform name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : ATI Stream&lt;BR&gt;Platform vendor&amp;nbsp;&amp;nbsp;&amp;nbsp; : Advanced Micro Devices, Inc.&lt;BR&gt;Platform extensions: cl_khr_icd&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;...さっくりイケちゃったみたい。出だし好調っすねー。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192153.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>おひさしぶりにXMLParserなど</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/07/192114.aspx</link><pubDate>Sat, 07 Aug 2010 11:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/07/192114.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192114.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/07/192114.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192114.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192114.aspx</trackback:ping><description>&lt;P&gt;ボーズにおねだりされまして。&lt;BR&gt;&lt;BR&gt;「&lt;A href="http://astore.amazon.co.jp/episteme00-22/detail/B001TK30R0"&gt;ドミニオン&lt;/A&gt;のサプライから10枚ﾃｹﾄｰに選んでくれるアプリ作ってぇ」&lt;BR&gt;「作っちゃるよー、んじゃ週末にちゃっちゃとね」&lt;BR&gt;&lt;BR&gt;なんつー安請け合い。ま、どってことないんじゃね(ほじほじ)&lt;BR&gt;元ネタとなるカードデータはツブシが効くようにXMLで用意しました:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;lt;?xml version='1.0' encoding='shift_jis' ?&amp;gt;&lt;BR&gt;&amp;lt;dominion&amp;gt;&lt;BR&gt;&amp;lt;card&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;key&amp;gt;0.01&amp;lt;/key&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;name&amp;gt;へそくり&amp;lt;/name&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;series&amp;gt;プロモ&amp;lt;/series&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;cost&amp;gt;5&amp;lt;/cost&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;portion_cost&amp;gt;0&amp;lt;/portion_cost&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;action&amp;gt;false&amp;lt;/action&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;treasure&amp;gt;true&amp;lt;/treasure&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;point&amp;gt;false&amp;lt;/point&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;attack&amp;gt;false&amp;lt;/attack&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;reaction&amp;gt;false&amp;lt;/reaction&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;continuous&amp;gt;false&amp;lt;/continuous&amp;gt;&lt;BR&gt;&amp;lt;/card&amp;gt;&lt;BR&gt;&amp;lt;card&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;key&amp;gt;1.01&amp;lt;/key&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;name&amp;gt;市場&amp;lt;/name&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;series&amp;gt;無印&amp;lt;/series&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;cost&amp;gt;5&amp;lt;/cost&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;portion_cost&amp;gt;0&amp;lt;/portion_cost&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;action&amp;gt;true&amp;lt;/action&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;treasure&amp;gt;false&amp;lt;/treasure&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;point&amp;gt;false&amp;lt;/point&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;attack&amp;gt;false&amp;lt;/attack&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;reaction&amp;gt;false&amp;lt;/reaction&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;continuous&amp;gt;false&amp;lt;/continuous&amp;gt;&lt;BR&gt;&amp;lt;/card&amp;gt;&lt;BR&gt;...&lt;BR&gt;&amp;lt;/dominion&amp;gt;&lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;.NETならSystem.Xml.Linqで&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;// dominion.xmlから&amp;lt;card&amp;gt;要素を列挙して&lt;BR&gt;foreach ( XElement element in XElement.Load("dominion.xml").Elements("card") ) {&lt;BR&gt;&amp;nbsp; どーのこーの&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;}&lt;BR&gt;&lt;BR&gt;すりゃえぇわけだが、ボーズのマシンがショボくてメモリかつかつで.NETなんつー大それたもんインスコしたくないとゆー。うんじゃnativeで書くかと。&lt;BR&gt;&lt;BR&gt;ってわけでひさしぶりに&lt;A href="http://xerces.apache.org/xerces-c/"&gt;Apache Xerces-C&lt;/A&gt;とかひっぱりだしてきたりする。&lt;BR&gt;まずは手習いがてら&amp;lt;name&amp;gt;でも列挙してみっか：&lt;BR&gt;&lt;BR&gt;#include &amp;lt;iostream&amp;gt;&lt;BR&gt;#include &amp;lt;locale&amp;gt;&lt;BR&gt;#include &amp;lt;memory&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;#include &amp;lt;xercesc/parsers/XercesDOMParser.hpp&amp;gt;&lt;BR&gt;#include &amp;lt;xercesc/dom/DOM.hpp&amp;gt;&lt;BR&gt;#include &amp;lt;xercesc/sax/HandlerBase.hpp&amp;gt;&lt;BR&gt;#include &amp;lt;xercesc/util/XMLString.hpp&amp;gt;&lt;BR&gt;#include &amp;lt;xercesc/util/PlatformUtils.hpp&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;using namespace std;&lt;BR&gt;using namespace xercesc;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int run(const wchar_t* target) {&lt;BR&gt;&amp;nbsp; unique_ptr&amp;lt;XercesDOMParser&amp;gt; parser(new XercesDOMParser());&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; unique_ptr&amp;lt;ErrorHandler&amp;gt; errHandler(static_cast&amp;lt;ErrorHandler*&amp;gt;(new HandlerBase()));&lt;BR&gt;&amp;nbsp; parser-&amp;gt;setErrorHandler(errHandler.get());&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // パースして&lt;/FONT&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parser-&amp;gt;parse(target);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ドキュメントのルートエレメント配下の&amp;lt;name&amp;gt;要素を抜き出して&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOMNodeList* nodes = parser-&amp;gt;getDocument()-&amp;gt;getDocumentElement()-&amp;gt;getElementsByTagName(L"name");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // テキスト・コンテントをプリントしるー&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( XMLSize_t i = 0; i &amp;lt; nodes-&amp;gt;getLength(); ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wcout &amp;lt;&amp;lt; dynamic_cast&amp;lt;DOMElement*&amp;gt;(nodes-&amp;gt;item(i))-&amp;gt;getTextContent() &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; } catch ( ... ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wcout &amp;lt;&amp;lt; L"Something wrong" &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; return 0;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;int main() {&lt;BR&gt;&amp;nbsp; wcout.imbue(locale("japanese"));&lt;BR&gt;&amp;nbsp; try {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; XMLPlatformUtils::Initialize();&lt;BR&gt;&amp;nbsp; } catch ( const XMLException&amp;amp; ex ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wcout &amp;lt;&amp;lt; ex.getMessage() &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -1;&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; int result = run(L"dominion.xml");&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2 face="Courier New"&gt;&amp;nbsp; XMLPlatformUtils::Terminate();&lt;BR&gt;&amp;nbsp; return result;&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;実行結果:&lt;BR&gt;へそくり&lt;BR&gt;市場&lt;BR&gt;改築&lt;BR&gt;鍛冶屋&lt;BR&gt;金貸し&lt;BR&gt;木こり&lt;BR&gt;議事堂&lt;BR&gt;玉座の間&lt;BR&gt;研究所&lt;BR&gt;鉱山&lt;BR&gt;工房&lt;BR&gt;宰相&lt;BR&gt;....&lt;BR&gt;&lt;BR&gt;VS2010はnative-C++でのｲﾝﾃﾘｾﾝｽがひじょーにキモチ良く動いてくれるんで快適です。&lt;BR&gt;ちょいと昔はマニュアル首っぴきで苦労したですが。&lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192114.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>επιστημη</dc:creator><title>TBBで遊んでみたよ(15)</title><link>http://blogs.wankuma.com/episteme/archive/2010/08/06/192087.aspx</link><pubDate>Fri, 06 Aug 2010 20:14:00 GMT</pubDate><guid>http://blogs.wankuma.com/episteme/archive/2010/08/06/192087.aspx</guid><wfw:comment>http://blogs.wankuma.com/episteme/comments/192087.aspx</wfw:comment><comments>http://blogs.wankuma.com/episteme/archive/2010/08/06/192087.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/episteme/comments/commentRss/192087.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/episteme/services/trackbacks/192087.aspx</trackback:ping><description>&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;TBB&lt;/SPAN&gt;の並列アルゴリズム&lt;SPAN lang=EN-US&gt; parallel_&lt;/SPAN&gt;なんちゃら の中から使用頻度の高そげな&lt;/FONT&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;parallel_reduce &lt;/SPAN&gt;をご紹介。&lt;SPAN lang=EN-US&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;まぁキホン&lt;SPAN lang=EN-US&gt; parallel_for &lt;/SPAN&gt;と同じく繰り返し&lt;SPAN lang=EN-US&gt;(loop)&lt;/SPAN&gt;の並列化なんだけども &lt;/FONT&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;parallel_reduce &lt;/SPAN&gt;には繰り返しの合間に&lt;SPAN lang=EN-US&gt; reduction(&lt;/SPAN&gt;リダクション&lt;SPAN lang=EN-US&gt;:&lt;/SPAN&gt;還元&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;縮約&lt;SPAN lang=EN-US&gt;/&lt;/SPAN&gt;要は&lt;SPAN lang=EN-US&gt;"&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Arial&gt;おまとめ&lt;SPAN lang=EN-US&gt;")&lt;/SPAN&gt;が割り込みます。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;ふたつのベクトル&lt;SPAN lang=EN-US&gt; x[0..N-1] &lt;/SPAN&gt;と&lt;SPAN lang=EN-US&gt; y[0..N-1] &lt;/SPAN&gt;の内積を求めてみんとす。内積ちゅーの&lt;/FONT&gt;&lt;FONT face=Arial&gt;は&lt;SPAN lang=EN-US&gt;:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;BR&gt;&amp;nbsp;&lt;/SPAN&gt;x&lt;/SPAN&gt;・&lt;SPAN lang=EN-US&gt;y = &lt;/SPAN&gt;∑&lt;SPAN lang=EN-US&gt;x[i]*y[i] (i = 0..N-1)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;BR&gt;ですな。こいつはインデクスを&lt;SPAN lang=EN-US&gt; 0..M-1 &lt;/SPAN&gt;と&lt;SPAN lang=EN-US&gt; M..N-1 &lt;/SPAN&gt;の二つに分けて&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&lt;BR&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;∑&lt;SPAN lang=EN-US&gt;x[i]*y[i] (i = 0..M-1) &lt;/SPAN&gt;と&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;∑&lt;SPAN lang=EN-US&gt;x[i]*y[i] (i = M..N-1) &lt;/SPAN&gt;との&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;BR&gt;和を求めても同じ結果。いくつに分割してもかまわんから並列処理にはうってつけ。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;ただし、それぞれの部分和を積算&lt;SPAN lang=EN-US&gt;(&lt;/SPAN&gt;おまとめ&lt;SPAN lang=EN-US&gt;)&lt;/SPAN&gt;するとこ&lt;SPAN lang=EN-US&gt;(&lt;/SPAN&gt;ココが&lt;SPAN lang=EN-US&gt;reduction)&lt;/SPAN&gt;では各ス&lt;/FONT&gt;&lt;FONT face=Arial&gt;レッドが&lt;/FONT&gt;&lt;FONT face=Arial&gt;勝手にやらんようにガードせんならんです。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;&lt;SPAN lang=EN-US&gt;parallel_reduce&lt;/SPAN&gt;には&lt;SPAN lang=EN-US&gt;loop&lt;/SPAN&gt;範囲と初期値、処理本体および&lt;SPAN lang=EN-US&gt;reduction&lt;/SPAN&gt;処理を与えます。&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT size=2 face="Courier New"&gt;#include &amp;lt;iostream&amp;gt;&lt;BR&gt;#include &amp;lt;array&amp;gt;&lt;BR&gt;#include &amp;lt;numeric&amp;gt;&lt;BR&gt;#include &amp;lt;tbb/tbb.h&amp;gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT size=2 face="Courier New"&gt;using namespace std;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;BR&gt;// 作為的に遅い掛け算&lt;BR&gt;double mult(double x, double y) {&lt;BR&gt;&amp;nbsp; const int N = 100000;&lt;BR&gt;&amp;nbsp; double sum = 0.0;&lt;BR&gt;&amp;nbsp; for ( int i = 0; i &amp;lt; N; ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sum += x*y;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; return sum / (double)N;&lt;BR&gt;};&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;BR&gt;// フツーに内積&lt;BR&gt;tbb::tick_count::interval_t&lt;BR&gt;serial_inner_product(double x[], double y[], double&amp;amp; z, int n) {&lt;BR&gt;&amp;nbsp; tbb::tick_count t = tbb::tick_count::now();&lt;BR&gt;&amp;nbsp; double result = 0.0;&lt;BR&gt;&amp;nbsp; for ( int i = 0; i &amp;lt; n; ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result += mult(*x,*y);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++x; ++y;&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; z = result;&lt;BR&gt;&amp;nbsp; return tbb::tick_count::now() - t;&lt;BR&gt;}&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT size=2 face="Courier New"&gt;&lt;BR&gt;// 並列に内積&lt;BR&gt;tbb::tick_count::interval_t&lt;BR&gt;parallel_inner_product(double x[], double y[], double&amp;amp; z, int n) {&lt;BR&gt;&amp;nbsp; tbb::tick_count t = tbb::tick_count::now();&lt;BR&gt;&amp;nbsp; z = tbb::parallel_reduce( tbb::blocked_range&amp;lt;int&amp;gt;(0,n), 0.0, // [0,n) の範囲で、初期値0.0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 切り分けられた範囲での内積を求め&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&amp;amp;](const tbb::blocked_range&amp;lt;int&amp;gt;&amp;amp; range, const double&amp;amp; value) -&amp;gt; double {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double result = value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( int i = range.begin(); i != range.end(); ++i ) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result += mult(x[i],y[i]);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // リダクション汁&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [](const double&amp;amp; x, const double&amp;amp; y) { return x + y; });&lt;BR&gt;&amp;nbsp; return tbb::tick_count::now() - t;&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&lt;FONT size=2 face="Courier New"&gt;int main() {&lt;BR&gt;&amp;nbsp; // 1*1 + 2*2 + 3*3 + ... + N*N を求めるよ&lt;BR&gt;&amp;nbsp; const int N = 100;&lt;BR&gt;&amp;nbsp; array&amp;lt;double,N&amp;gt; x;&lt;BR&gt;&amp;nbsp; array&amp;lt;double,N&amp;gt; y;&lt;BR&gt;&amp;nbsp; iota(x.begin(),x.end(),1.0);&lt;BR&gt;&amp;nbsp; iota(y.begin(),y.end(),1.0);&lt;BR&gt;&amp;nbsp; double sz, pz;&lt;BR&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; "serial:&amp;nbsp;&amp;nbsp; " &amp;lt;&amp;lt; serial_inner_product(&amp;amp;x[0],&amp;amp;y[0],sz,N).seconds() &amp;lt;&amp;lt; "[sec.]\n";&lt;BR&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; "parallel: " &amp;lt;&amp;lt; parallel_inner_product(&amp;amp;x[0],&amp;amp;y[0],pz,N).seconds() &amp;lt;&amp;lt; "[sec.]\n";&lt;BR&gt;&amp;nbsp; std::cout &amp;lt;&amp;lt; sz &amp;lt;&amp;lt; '/' &amp;lt;&amp;lt; pz &amp;lt;&amp;lt; std::endl;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;実行結果&lt;SPAN lang=EN-US&gt;(dual-core)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=Arial&gt;serial:&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;0.0807083[sec.]&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=Arial&gt;parallel: 0.0465302[sec.]&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;FONT face=Arial&gt;338350/338350&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="MARGIN: 0mm 0mm 0pt" class=MsoPlainText&gt;&lt;FONT face=Arial&gt;おー、いぃ感じに&lt;SPAN lang=EN-US&gt;core&lt;/SPAN&gt;数なりのスピードアップなりねー&lt;BR&gt;&lt;SPAN lang=EN-US&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/episteme/aggbug/192087.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>