jirohclまず、前回説明し忘れた重要なnoise関数。sy);}となっており、パーティクルの座標と4点少しずらした座標でbilerpして求めます。rnd_table_[i][1]=-s*rnd_table_orig_[i][0]+c*rnd_table_orig_[i][1];}このように円を書くように更新していく事で、うずまくような動きになります。^^^^^^^ノイズゲインを上げることによってこの動きは顕著になります。(前回の↑部分がゲイン)といった所で前回の説明忘れ部分は終了です。次にパフォーマンス比較を忘れていたので行いました。singleはシングルスレッド。ompはOpenMPを用いた並列化の結果になります。大体想定どおりの結果です。ompが若干遅いですが2coreのアレなCPUを使ってるので現行の4core辺りなら40-60ms位に落ち着くのではないでしょうか。Noise自体が並列化し易く、かつ入力データが多い例なのでOpenCLでの高速化が上手くはまるアルゴリズムでしたのでこのような(理想的な)結果に落ち着きましたが、何でもかんでもGPGPUで高速化できるものではありません。Calenderを終了しようと思います。OpenCLどうも再び@jirohclです。Calender@12日目です!人数が少なく、下手をすればもう一度まわってくるらしいのですが完全にネタも尽きてはたしてどうなる事やら。愚痴はアンドロメダ星雲にでもすっ飛ばしておくとして、今回はこんなものを実装してみましたネタです。Philosophyでも使われていたパーティクルの技法です。主な特徴としては、パーティクル同士の判定を行わないために超高速、剛体との衝突がなんかそれっぽく見える、といった所でしょうか。これをどうOpenCLに持っていくかというと、パーティクルの更新が都合よく並列化に向いていたためupdate関数をカーネル化してやりました。curl_vel(mid,rx,t[0],rt,rti)*0.04f;}ここで特筆する点は乱数テーブル(rt)をホストから渡している所でしょうか。この乱数テーブルは円状に配置された点をswapしてテーブル化してあります。v;}速度の計算です、パーティクルの現在位置から微小距離ずらし、ポテンシャル関数を用いて速度を求めます。base_psi+turb;}そしてこのポテンシャル関数の中で、回転するノイズ関数、剛体や風等の周りからの力の付与を計算することで流体を表現するらしいです。実装に疲れたので説明はおざなりですが中々面白い技術なので皆様試してみてはいかがでしょうか?Windows用の実行ファイルになり、かつ他の環境で動くかどうか怪しいですが一応デモも置いておきます。Worldお久しぶりです。@jirohclです。Calenderの季節になりました。Calender@3日目となります。この記事は温故知新と聞こえの良い事を言いつつ、ネタが思い浮かばなかった苦肉の策、タイトルの通り古臭いGPGPUをやってみようと思います。古臭いGPGPUとは何かと言うと、プログラマブルシェーダ、特にピクセルシェーダを用いて汎用計算をやってみましょうというアレです。これを知ることでCUDA/OpenCL等は裏側で一体何をしているのか押し知ることが出来、また効率的な実装の方法も見えてくるはず。(建前)まず、GPGPUをするために何が必要かというとご存知の通り1.デバイスへの入力2.処理関数3.ホストへの出力これら3つ。1の入力はテクスチャを使うのがポピュラーな方法です。次に2の処理関数に関してはフラグメントシェーダーで頑張ります。3はglReadPixels等のレンダリング後の画像を読み込む関数を使うことで結果を取り出します。デバイス側のコード(行列積)を見てみましょう。vec4(result,1.f);}バーテクスシェーダ自体は何も特別なことは行わず、フラグメントシェーダで積を演算しています。ここでフラグメントシェーダでの演算ですが実は一つ大きな問題があり、フラグメントシェーダー内での処理には時間制限があるために行列のサイズが大きくなると計算が正常に終了しなくなります。OpenCLを使ったことがある方はきっと身に覚えがあるかと思います。0);::glDisableClientState(GL_VERTEX_ARRAY);::glDisableClientState(GL_TEXTURE_COORD_ARRAY);::glFlush();::glReadPixels(0,0,mat_size,mat_size,GL_RGBA,GL_FLOAT,result);デバイスへのデータ転送、カーネルの実行する”だけ”でもこれだけの決まりごとの命令が必要になります。この他にもシェーダの初期化、ユニフォーム、イン/アウトへの関連付け、等々面倒くさい作業が目白押しとなっております。