1 名前:デフォルトの名無しさん mailto:sage [2005/10/08(土) 23:15:20 ] いつの間にやらCPUを超える演算性能を持ってしまったGPUに計算させてみるという GPGPUについて語りましょう 参考リンク 総本山? gpgpu.org www.gpgpu.org/ GPUをCPU的に活用するGPGPUの可能性 pcweb.mycom.co.jp/articles/2005/09/06/siggraph2/
515 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 18:28:10 ] SLI CUDAできるのかな?
516 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 18:38:50 ] 出張期間延長で 通販にしとけばヨカター と嘆きつつPC一式調達してホテルでいじる>>514 に乾杯!
517 名前:デフォルトの名無しさん mailto:sage [2007/04/07(土) 20:41:43 ] ttp://www.kohgakusha.co.jp/support/rtmshadr/index.html ここのソース試した人いる? VCでまともに動かないんだけど
518 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 03:18:39 ] もうすぐGF8600および8500が出る。 それからが本当にGPGPUが普及するかの正念場だな。 8800はヘビーユーザーだけの代物だったが、8600や8500は十分一般ユーザーの手に入る価格帯だし。 まぁ、その分ベンチは散々だが、所詮ローエンド
519 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 04:33:46 ] まぁ、このスレ何気に4割が俺の書き込みなんだよなぁ・・・。 その状況から言って、やっぱり寂しいものがあるよなぁ。。。
520 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 05:52:11 ] おまいさん>>131 か?
521 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 09:09:30 ] 毎日スレ更新してるのでバンバン書き込んでください^−^
522 名前:デフォルトの名無しさん mailto:sage [2007/04/08(日) 11:04:36 ] まだ手を出すのは早いからな デフェクトスタンダートが決まりつつあり 日本語ドキュが整備されつつあるぐらいでも 十分遅くない、経験的に
523 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 04:26:21 ] >>514-515 CUDAのforumに、GPUが非SLIで複数ささってれば全部使うよー、って書いてあった気がするんだけど、ソースを失念。
524 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 04:38:03 ] そんな(消費電力とスペースの)恐ろしいことはできないw
525 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 15:21:38 ] 最近のGPUは前世代の2倍のパフォーマンスだけど消費電力も2倍って感じだからなw ATIの新しいのはビデオカードだけで250Wとか酷すぎる。
526 名前:デフォルトの名無しさん mailto:sage [2007/04/09(月) 15:46:29 ] 8800GTXなんて、+12V電源を30A用意しろと書いてあるよ。 単純計算するとそれだけで360Wだ。 #実際、ボード上に+12V用6pin電源コネクタが二つもある。
527 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 03:40:49 ] CPUのように消費電力が通常の半分で値段が通常の1.5〜2倍の 製品を出してくれれば、一般的な開発者もGPCPUの検討用に買ってみようか、 というやつが増えると思う。 次世代では両者とも検討してほしいところ。 ・・・と思ったが、250Wやら300Wやらじゃ、半分でもNetbust「全盛期」かそれ以上だ。 んなもん、ゲームもしないのに買ってもアホらしいな。
528 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 11:08:03 ] 計算終わった後に「チーン」って音しそうだな。
529 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 13:24:32 ] おい、CUDA SDK 0.81 あるぞ。
530 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 14:16:29 ] あるぞといわれても
531 名前:時々書いてるこのスレの住人 mailto:sage [2007/04/13(金) 14:32:29 ] 取り敢えず拾った。 >>529 THX!
532 名前:デフォルトの名無しさん mailto:sage [2007/04/13(金) 18:29:20 ] >>529 アリガタマキン ( ´∀`)ノ⌒ω)Д`)ブニュ
533 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 13:13:41 ] けっこうCUDA使い=8800使いがいるんだね。 簡単な結果でいいから、報告してくれないかな。
534 名前:・∀・)っ-○◎● mailto:sage [2007/04/15(日) 13:21:27 ] おれCUTA使い
535 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 15:41:46 ] ( ´д)ヒソ(´д`)ヒソ(д` )ヒソ
536 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 16:37:35 ] >>533 なんか適当なベンチマークないかね。 nVideaのサンプルは動作確認っぽいのばかりで動かしても面白くないのだけれど。 #つーか、私も作らないとなんだけどね(苦笑
537 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 16:44:08 ] SDK 0.8だと、どうしても一塊のデータをわっと処理するバッチ系の サンプルしかなかったので、俺の場合まだまだ基本性能を評価する段階だった。 NVIDIA FORUMでは、「演算サーバみたいなもの組めねえぞゴルァ」なトピックがHotだった。 >>529 は俺なんだが、今別の遊びをやってるのでCUDAしばらく棚上げだ。 他の誰かがほげってくれるのを待つ!
538 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 23:54:14 ] >>533 同意 とりあえず>>424 の姫野ベンチの結果が知りたいな
539 名前:536 mailto:sage [2007/04/16(月) 11:31:05 ] Linuxだから無理。 じゃないけどBrook入れてないからめんどい。
540 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 12:17:16 ] 実行だけならBrook入れなくても 出来るよ。
541 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 23:48:51 ] >>533 つーか今CUDAって8800以外で使えるの?
542 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:04:18 ] ゲフォ廉価版出たけどあまりにも性能差が差別化されまくり。 それでも、エミュよりマシだと思えばいいのか。
543 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 20:24:05 ] 8600が出ましたよ。
544 名前:デフォルトの名無しさん [2007/04/18(水) 21:09:01 ] 質問です。 ifやswitchなど条件分岐を一切使わずに汎用プログラミングを行うと言うのがかなり理解出来ないのですが 一般的にGPUでのプログラミングでは、この辺はどのようにしているのでしょうか? 例えば、GPGPUによる、動画のエンコーダーなどの分野は期待しているのですが あの手の処理は、条件分岐の塊だと思うので、GPUではそれらが使えないとなると有効な実装方法が思いつきません。
545 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:05:46 ] >>544 分岐の分だけmain()を作る 今はもうレガシな手法になりつつあるが。 当然個々のフラグメントプログラムは 画一したフローを踏むことになる。
546 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:16:00 ] >>545 一瞬びっくり!という感じだけど、やっぱりわからない。 if文は普通にc++で書いて特定の箇所で飛ばすのに比べて、 mainたくさんというのは、どういうメリットがあるの?
547 名前:・∀・)っ-○◎● mailto:sage [2007/04/18(水) 22:43:44 ] mainじゃなくてもサブルーチンでもいいけど、分岐の頻度を最小限に減らさないといけない パイプラインが長いと、分岐の度に大きなペナルティ食らうわけよ んで for (i = 0; i < 1000; i++) { if (a == b) { //HogeHoge } else { //BokuhaKamiyamaMangetuChan } } よりも if (a == b) { for (i = 0; i < 1000; i++) { //HogeHoge } } else { for (i = 0; i < 1000; i++) { //BokuhaKamiyamaMangetuChan } } のほうが速いよね。 パフォーマンス重視なら、分岐を繰り返し処理の外に追い出せる場合は なるべくそうしたほうがいい。たとえ冗長になってもね。 普通のCPU向けプログラミングでも同じ (最近は分岐予測のほうが賢くなってるから一概にはいえないけど)
548 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:12:58 ] >>547 >>545 の話はそういう話なのかい? >mainじゃなくてもサブルーチンでもいいけど あんたのコードで//HogeHogeのところで別プロセス呼んでたりしたら、 普通は頭がおかしいコードだと思うよね。
549 名前:・∀・)っ-○◎● mailto:sage [2007/04/18(水) 23:19:36 ] プログラムって基本的にループの塊なんで、 むしろループがプロセスの単位だと思ってくれ
550 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:24:46 ] いやさ、おれもコード書きのはしくれなんで、forkくらいは使うけど、 >>545 のはGPUを使うときの独自の流儀の話をしてんじゃないの?ってこと。
551 名前:・∀・)っ-○◎● mailto:sage [2007/04/18(水) 23:24:58 ] ちなみにGPUにプロセスの概念はない。GPU上でOSは動かないだろ。
552 名前:・∀・)っ-○◎● mailto:sage [2007/04/18(水) 23:32:44 ] たとえばJPEGの量子化なんかだと、除算値を定数化できれば大幅に高速化できるわけで。 でもコンパイル時には不定なわけで。 でも除算値毎にEXE作ってたらアホらしいから、普通のCPUだと、動的に命令コード生成したり する。一般人はこんな面倒なことやらないけど、トップガンの常套手段ね。 でもGPUだとそういうことできないから(CPU側でやれば可能かも) モジュールを複数作ってパラメータにあったのをロードすると。 そんだけの話でしょう。
553 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:59:05 ] >>552 いちおう理解できたようだ。感謝。 でも>>547 は関係ない話だろう。
554 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:13:38 ] スレが伸びてると思ったら糞団子かよ
555 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:46:37 ] トップガン(藁
556 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:50:39 ] 分岐コストが高いなら、両方のルートを計算すればいいだけ。 そういう頭の使い方ができない香具師にはGPUを使いこなすのは難しい。
557 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 01:04:55 ] つまり下手鉄砲も数打ちゃ当たる?
558 名前:・∀・)っ-○◎● mailto:sage [2007/04/19(木) 01:07:57 ] 弾の数が勿体ない。 スループット落ちるじゃないか。
559 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 01:09:19 ] 252 :Socket774 [sage] :2007/04/19(木) 00:15:30 ID:0/nRKtHL Larrabeeはかなり本気で開発している模様 > またRattner CTOが基調講演で触れたIAコアによるテラフロップCPUに関し、 > もう少し細かい話も出てきた。デモで紹介された80コアの試作チップはIAコアでは > なく、もっとシンプルなものだったが、IAコアを搭載するものを同社は開発中で、 > コードネームは「Larrabee」であることがGelsinger氏から明らかにされた。 > > 実際のコア数がどのくらいになるのかは不明だが、命令セットが拡張された > IAコアを搭載することになるようだ。これは製品化を前提にした開発のようで、 > 「来年にもデモが披露できる予定」とGelsinger氏。 そしてGPGPU終了のお知らせ > 最後にMicrosoft ResearchのDavid Williams氏の「Intelのこのアプローチは、 > GPGPUコンピューティングに関するディベートを終わらせることになる」という > コメントを引用し、Larrabeeに対する自信を見せた。 journal.mycom.co.jp/articles/2007/04/18/idf06/index.html
560 名前:・∀・)っ-○◎● mailto:sage [2007/04/19(木) 01:12:33 ] 早い話がIntel版Cellだな
561 名前:デフォルトの名無しさん [2007/04/19(木) 01:19:22 ] さすが団子チューさん^^
562 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 10:22:20 ] ダンゴの一言は重みがあるな
563 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 20:33:33 ] GPUで出来ることの幅が広がるのはうれしいけど 本来のGPU的の使用には向かなくなってるのかな? 例えば、これからコアもっとリッチに、粒度をもっと細かくしていくと 行き着く先はCell+だよね。で現状CellはGPUの代わりは出来ていない。
564 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 20:42:46 ] 上の奴は何を言ってるんだ? もっと勉強してこいと言いたい。
565 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 20:51:19 ] 今のGPUがやっているような、パラレリズムの特徴を利用してメモリアクセスの レイテンシーを隠ぺいできるような仕組みがないと、PUの利用効率が悪くなって 大きなファクターでの性能向上は難しいような気がする。 個人的には David Williams 氏のいうことはあまり信用できないな。
566 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 21:34:20 ] >>556-558 ItaniumやXbox360 GPUのプレディケーションって奴では? XBOX360なら48 shader 分岐待ちしてるのと、演算にリソース使うの どっちが良いんだろう? まぁ、R520系のように分岐ユニット(?)をつければ良いのかな・
567 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 21:42:32 ] G70系のように比較的大きい粒度だと小さいレジスタですんでたのが R520系では小さい粒度のためG70系に比して大きいレジスタを搭載している。 NVIDIAはどうか知らないがAMDは更に小さくするんじゃないかな?粒度
568 名前:536 mailto:sage [2007/04/20(金) 18:36:53 ] 取り敢えずCUDAのサンプルと同等の処理をgccでコンパイルして較べてみた。 3.4GHzXeonで66ms掛かる処理が8800GTXで0.23ms。 #サンプルはsimpleTexture。 こういうサンプルだと確かに速いね。 #いかん、Xeonの方はsse使ってないやw
569 名前:536 mailto:sage [2007/04/20(金) 19:28:19 ] で、Xeonでsse使ったら(ベクタ化してないけど)44msにはなった。 でも、200倍近く。これなら取り敢えず、実験でお金が貰えそうだw
570 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 05:44:09 ] >>568 ども。 Xeon Quad DPのコア当たり性能が仮にNetburst Xeon 3.4GHzの倍だとしても、 x 2 x 4 x 2 でもまだ、10倍以上か。 double演算エミュレーションのサンプルみたいのはあるのかな?
571 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 06:18:08 ] コード示さんとわからん。
572 名前:536 mailto:sage [2007/04/21(土) 08:21:24 ] GPU側はCUDAのサンプル、CPU側はそれを移植したもの。 どうしても見せろってことなら後で載せるよ。 #どうせだからこのPCでもコンパイルしてタイムを計ってみるか。
573 名前:536 mailto:sage [2007/04/23(月) 18:28:24 ] あー、載せるの忘れてた。CPU版のソースはこんな感じ。これをGPUのサンプルのtransform()と入れ替えて辻褄合わせた。 #でも、CUDAではgetData()相当で単純に整数化しないでニアレストネイバーか何かでサンプリングしているのでその分更に差が開く…… static float getData(float * data, float x, float y, int width, int height) { int ix = static_cast<int>((x + 1) * width + 0.5f); int iy = static_cast<int>((y + 1) * height + 0.5f); ix %= width; iy %= height; return data[iy * width + ix]; } void transform(float * rdata, float* g_odata, int width, int height, float theta) { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { float u = x / (float) width; float v = y / (float) height; u -= 0.5f; v -= 0.5f; float tu = u*cosf(theta) - v*sinf(theta) + 0.5f; float tv = v*cosf(theta) + u*sinf(theta) + 0.5f; rdata[y*width + x] = getData(g_odata, tu, tv, width, height); } } } このコード、Celeron1.2GHzでは109msだった。
574 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 19:42:27 ] >>573 おいおい、そのCPU用のコードはいくらなんでも冗談だろ?
575 名前:536 mailto:sage [2007/04/23(月) 19:49:31 ] >>574 何か問題でも? getData()はCUDAのサンプルの出力からの類推ででっち上げたから問題があるとしたらその辺かな? transform()に関してはCUDAのサンプルのロジックそのままだからそれについては何もコメントできないけど。
576 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:21:04 ] >>575 CUDAで実行した場合に transformKernel() 内のすべてのロジックを 各画素について糞真面目に計算してるとでも思ってるのか? そのCPUコードじゃGPUと対等じゃないよ。
577 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 20:37:55 ] 普通に考えて、width, height, thetaのみに依存する(入力ストリーム全体に対して不変の) ロジックは先に計算してGPUの定数レジスタに格納する、くらいの最適化はしてるだろうね。 DirectXのHLSLシェーダをアセンブリにコンパイルしたときのpreshaderみたいに。
578 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 21:22:20 ] >>573 CPU側をこんな感じにすればGPUの計算量に近くなるかな void transform(float * rdata, float* g_odata, int width, int height, float theta) { float inv_width = 1.0f / width; float inv_height = 1.0f / height; float sin_theta = sinf(theta); float cos_theta = cosf(theta); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { float u = x * inv_width; float v = y * inv_height; u -= 0.5f; v -= 0.5f; float tu = u*cos_theta - v*sin_theta + 0.5f; float tv = v*cos_theta + u*sin_theta + 0.5f; rdata[y*width + x] = getData(g_odata, tu, tv, width, height); } } } 逆にCUDAのほうでsin, cosの中身をthetaだけじゃなくビルトイン変数blockIdxとかに依存させたら 各入力に対して毎回三角関数を計算せざるを得なくなるから劇的に遅くなるんじゃないかな
579 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 21:58:44 ] gcc、それくらいの最適化は任せられなかったっけ? 気持ちが悪いから、可読性が落ちないなら、速い方にするけど。 >>573 にもう一度回してもらうのが一番手っ取り早いか。
580 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 22:24:02 ] >>579 sinf, cosfは外部のライブラリ関数で、Cコンパイラはその処理内容を知る立場にないから、 for文の中にある関数の呼び出し回数を勝手に減らすような最適化は普通しないと思うよ。 インライン関数だったらそういう最適かも可能だけど。
581 名前:536 mailto:sage [2007/04/23(月) 23:00:41 ] うい、流れは理解した。 明日にでも試してみる。 >>580 gccはsinf()はインライン展開しないようだね。 このテストじゃないけれど、iccはsincos同時に求める専用関数に置き換えるくらいのことはする。 iccの方は現在手元にないから水曜日になるけどテストしてみま。
582 名前:デフォルトの名無しさん mailto:sage [2007/04/23(月) 23:33:10 ] >>581 投げてばっかりで悪いけど、よろしく。 8600でも買おうかと思ってたけど、unitが半分のはずが1/4しかないんでちょっと萎えてる状態。
583 名前:デフォルトの名無しさん [2007/04/24(火) 06:46:36 ] CUDAって、Vistaにまだ対応してないよね? あと、XPはx64にも対応してないけど、これってネイティブな64bitモードで動かないってだけ? 俺メインマシンがVistaとXP x64とのデュアルブートだから、CUDAの導入に踏み切れない・・・。 対応してるなら、早速グラボ買って来るんだが・・・
584 名前:デフォルトの名無しさん [2007/04/24(火) 06:58:26 ] 積は最近遅くない気もするがね。 void transform(float * rdata, float* g_odata, int width, int height, float theta) { float inv_width = 1.0f / width; float inv_height = 1.0f / height; float sin_theta = sinf(theta); float cos_theta = cosf(theta); float v = -0.5f; for (int y = 0; y < height; ++y, v += inv_height) { float u = -0.5f; for (int x = 0; x < width; ++x, u += inv_width) { float tu = u*cos_theta - v*sin_theta + 0.5f; float tv = v*cos_theta + u*sin_theta + 0.5f; *rdata = getData(g_odata, tu, tv, width, height); ++rdata; } } }
585 名前:536 mailto:sage [2007/04/24(火) 17:56:14 ] ほい、お待たせ。 結論から言うと、10msそこそこまで速くなった。 #コンパイルオプションつけ捲くりw(-O3 -funroll-loops -msse2 -mfpmath=sse) コードの方は>584をベースにgetData()も手動最適化したくらい。ってことで、念の為にコード。 static float getData(float * data, float x, float y, int width, int height, float wf, float hf) { int ix = static_cast<int>(x * width + wf); int iy = static_cast<int>(y * height + hf); ix %= width; iy %= height; return data[iy * width + ix]; } 呼び出し側は、 float width_half_up = width + 0.5f; float height_half_up = height + 0.5f; しておいて *rdata = getData(g_odata, tu, tv, width, height, width_half_up, height_half_up); ちなみにアセンブリ出力を眺めたところ、rdata[y*width+x]と*rdata, ++rdataでは一番内側のループ内のロジックは同一。 この程度の最適化はするらしい。どうやら主な違いはu, vを計算しなおすのにx, yを使う関係でcvtsi2ssが入る辺りじゃないかと。 #掛け算より遅いかどうかは知らないけれど。 ってことで、レスくれている人達THX。こちらもどうせいろいろ資料作らなければならないんで、ネタ提供してもらって助かってます。 #そう言えば、DOSPARA辺りで8800積んだBTOのPC出始めてますねぇ。
586 名前:536 mailto:sage [2007/04/24(火) 18:31:54 ] >>583 この辺は参考にならない? forums.nvidia.com/index.php?showtopic=28716
587 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 20:27:32 ] >>585 どうもです。10msそこそこってのはCeleron1.2GHzですか? getData(テクスチャフェッチ)はGPUが非常に得意な部分だからそこでかなり差が付いてるかもね。
588 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 23:38:13 ] Celeron 1.2GHzならメモリが遅過ぎでしょう。 あとCeleronの場合、整数だけで座標を演算した方が速いと思う。 それにしても比較するのは酷な環境。
589 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 23:45:07 ] ところで時間計測はどのように行ってます?
590 名前:536 mailto:sage [2007/04/24(火) 23:49:26 ] いや、10msはXeon3.4GHz(>568-569参照)。 そう言えば、Celeronの速度は忘れてた。
591 名前:588 mailto:sage [2007/04/24(火) 23:55:05 ] あとこれCPUにもよるだろうけど、繰り返さなくていいなら if ( unsigned(width-1-ix) < width && unsigned(height-1-iy) < height ) return data[iy * width + ix]; else return 0.0f; の方が速いよな。 本当はループの外で判定出来るからもっと速くなるけど とりあえずこの程度は予測分岐で賄えるだろうと怠慢。
592 名前:デフォルトの名無しさん mailto:sage [2007/04/24(火) 23:56:58 ] 何言ってるか分りにくいか。 ix %= width みたいな除算が重たいから取り除くって話ね。
593 名前:536 mailto:sage [2007/04/25(水) 00:41:07 ] >>591-592 あー、それは敢えてCUDAサンプルの出力を見て合わせた。 最初は条件分岐でやったけど、確か大して時間変わらなかったように記憶している。 >>589 CUDAのサンプルの時間測定をそのまま使ってたんで、今調べたらgettimeofday()だった。
594 名前:588 mailto:sage [2007/04/25(水) 03:13:43 ] 積に比べれば遥かに重いんだけど、流石にXeonでは誤差か。 けどGPUがサイズを二の累乗に限定していたのはこういうところにもあるはずで、 例えばwidthとheightが二の累乗に限定出来れば ix %= width; を ix &= (width-1); にして除算が排除出来る。 Celeronではかなり効果あるんじゃないかなあ。
595 名前:デフォルトの名無しさん [2007/04/27(金) 00:55:48 ] 上の方でも条件分岐が必要な処理に関して質問があがってたのですが イマイチ、ぴんと来ないので質問させてください。 遂に昨日8シリーズを手に入れたのですが、とりあえずは簡単に使えるBrookGPUでDCTを実装して試そうと思ったんです。 で、DCTで係数kiとして kiの値は ki=1/√2 (i=0) ki=1 (i≠0) って処理がありますが、 具体的には、こういう部分はどのように書けばいいのでしょうか? ifが使えないとなると、せっかくforループを使わずにGPUに投げられるのに、ループ回してCPUでiの値を確認しなくてはいけなくなると思うんですが・・・ 初歩的な質問で申し訳ないのですが、この辺具体的な話がイメージ出来なくて困っています。
596 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 01:01:48 ] つか、ゲッパチ買ってきたんだけどCUDA糞じゃん 普通の文字列処理とかできねーじゃん。汎用GPUプログラミングとかいっておいて なーんもできねーじゃんゴミだだまされた。明日nvidiaに電凸しよう。
597 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 01:26:43 ] >>595 のは、ちょっと例が悪かったです。 ごめんなさい(汗 ただ、他にifを使う部分は、やっぱり数式に直すしかないんですかね?
598 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 01:42:26 ] >>597 悪いってレベルじゃねぇぞw で、結局そこはCPU側に出すか もしくは数式的に直せるのであればそうするしかないな。 CUDAは知らん。 >>596 はいはい。 使いこなせないだけですね。 文字列処理って何ですか? 文字列を数値化すれば、形態素解析であろうが、文字列マッチングであろうが 置換であろうが、余裕ですよ。
599 名前:デフォルトの名無しさん [2007/04/27(金) 06:51:15 ] >kiの値は >ki=1/√2 (i=0) >ki=1 (i≠0) 単純になら、ki=1-(1-1/√2)*(i==0) i==0の時だけループからはずすのも手だし、 テクスチャを係数テーブルにするほうが普通じゃ。
600 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 07:50:49 ] >>597 効率がどうなるかは知らんが、そういう用途ならCUDAの方が楽じゃない?
601 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 09:50:02 ] BrookGPUで各ユニットで共通の変数を利用したい場合ってどうすればいいのでしょうか? 例えば、 for(int i=0; i<128; i++) out[i]=i; や for(int i=0; i<128; i++) out[i]=out[i]+5; このようなパターンです。
602 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 09:55:56 ] >>601 まず、後者の場合、reduceを使う void reduce sum(reduce float res<>){ res=res+5; } こんな感じ 前者の場合。 イテレーターを使うんだと思うんだけど、ちょっと俺にもわからん。
603 名前:602 mailto:sage [2007/04/27(金) 09:57:59 ] って、うわ・・・ 後者も間違ってる。。sumの問題じゃなかったのね。 すまん。 その場合普通に kernel void (out float o<>){ o=o+5; } でいいじゃん。
604 名前:デフォルトの名無しさん mailto:sage [2007/04/27(金) 10:35:23 ] >>601 void reduce func(reduce float i<>, out float o<>){ o=i; i=i+1.0; } 後者は何が言いたいのかわからん。 普通で
605 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 00:19:43 ] お前らCUDAやりなさい。 ところで、CgがあるのにCUDAを出す意義って? nVIDIAは言語の乱立を自重汁
606 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 00:46:51 ] Cgはシェーダー言語。HLSLのベースになった時点であるいていど成功。 CUDAはプログラミング言語。
607 名前:デフォルトの名無しさん mailto:sage [2007/04/29(日) 00:49:41 ] >>606 はあプログラミング言語ねえ
608 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 03:02:44 ] >>595 conditional move とか select とか、そういう類の命令を持つ CPU とか GPU があるのね。 だから3項演算子とか>599のようなことで問題なし。 そんなことを気にするよりも、まずは動くものを作ってこことかどっかに投げないと、何が聞きたいのかわからんというか、何を答えても的外れになりそうな気分になって答えられない。
609 名前:デフォルトの名無しさん mailto:sage [2007/05/02(水) 13:22:28 ] BrookGPUって、intは使えないよね? データがint型で、ストリームに送る前にキャストしても返ってくる値がおかしいから困る・・・。 こういうのってどうすればいいんだ?
610 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 08:20:49 ] 桁落ちが原因だろ。>値がおかしくなる。 落ちない範囲に収めるor諦める
611 名前:デフォルトの名無しさん mailto:sage [2007/05/03(木) 18:01:20 ] コーヒーブレイク ttp://www.forum-3dcenter.org/vbulletin/showthread.php?p=5449565#post5449565 ttp://www.forum-3dcenter.org/vbulletin/showthread.php?p=5450755#post5450755 R600のリークスライドなんですが、SuperScalar,SIMD,VLIW等 並列実行のキーワードが並んでます。 詳しい人、どうなんでしょうこのGPU。
612 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 00:36:29 ] 電気馬鹿食いDQNカードだぞ?
613 名前:デフォルトの名無しさん [2007/05/04(金) 13:22:12 ] これからGPGPUに入門しようと思って、手始めに3Kのテキストデータの文字列に+1するだけの単純コードで実験してみた。 BrookGPUが簡単だったので、こいつを使った。 kernel void func(float i<>, out float o<>){ o=i+1.0; } //streamRead(in1,inc1); //func(in1,in1); //streamWrite(in1,inc1); for(i=0; i<2048;i++){ inc1[i]=inc1[i]+1; } //GPU:18秒 //CPU:9秒 …全然だめじゃん。GPGPUって 環境は、Athlon64 X2 4200+,GF8600GTS これより式を複雑にしたら、もっとスーパースカラーなCPUがより有利になるでしょ。 GPUは、和積演算だけは、同時実行出来るんだっけ?
614 名前:デフォルトの名無しさん mailto:sage [2007/05/04(金) 13:36:48 ] >>613 それは計算量少なすぎ。 明らか転送のネックの方が大きいだろw
615 名前:613 mailto:sage [2007/05/04(金) 13:40:38 ] >>614 CPUの時も、streamReadとstreamWriteだけやるようにしてみました。 それでもCPU:16秒でした^^;