1 名前:デフォルトの名無しさん mailto:sage [2012/09/23(日) 23:17:47.58 ] このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。 CUDA使いが優しくコメントを返しますが、 お礼はCUDAの布教と初心者の救済をお願いします。 CUDA・HomePage ttp://developer.nvidia.com/category/zone/cuda-zone 関連スレ GPGPU#5 ttp://hibari.2ch.net/test/read.cgi/tech/1281876470/ 前スレ 【GPGPU】くだすれCUDAスレ【NVIDIA】 ttp://pc12.2ch.net/test/read.cgi/tech/1206152032/ 【GPGPU】くだすれCUDAスレ pert2【NVIDIA】 ttp://pc12.2ch.net/test/read.cgi/tech/1254997777/ 【GPGPU】くだすれCUDAスレ pert3【NVIDIA】 ttp://hibari.2ch.net/test/read.cgi/tech/1271587710/ 【GPGPU】くだすれCUDAスレ pert4【NVIDIA】 ttp://hibari.2ch.net/test/read.cgi/tech/1291467433/ 【GPGPU】くだすれCUDAスレ part5【NVIDIA】 toro.2ch.net/test/read.cgi/tech/1314104886/
445 名前:デフォルトの名無しさん mailto:sage [2013/09/09(月) 21:57:16.85 ] >>444 レジストリはいじったあとなんだけどそうなる
446 名前:デフォルトの名無しさん mailto:sage [2013/09/10(火) 12:17:17.37 ] >>445 メモリアクセスが間違ってても落ちることあるですよ。
447 名前:デフォルトの名無しさん mailto:sage [2013/09/10(火) 23:29:52.04 ] Geforce GT 530 で CUDAインストーラー(5.5)が「対応デバイスが無い」とかで失敗するので 古いドライバに変えてみたり再起動繰り返したりしたのですが、 developer.nvidia.com/cuda-gpus に、GT530が載ってませんでした・・・。 マシンに「nVidia GEFORCE with CUDA」のシールあるし、GPU対応のソフトも動いているのですが 開発用としては使えないってことでしょうか?
448 名前:デフォルトの名無しさん mailto:sage [2013/09/10(火) 23:41:30.09 ] セットアップがミスってんでしょ。
449 名前:447 mailto:sage [2013/09/11(水) 00:36:33.98 ] セットアップのミスの原因ってなにかありますか? 展開後は高速インストールかカスタムか選ぶだけだし、 どちらを選んでも失敗します・・・。 プログレスバー見てる感じ、Toolkitのインストール中10%くらいでエラーが出ます。 c:\NVIDIA\CUDAへの展開でかなり時間かかりますが、 インストール失敗すると、この下のインストーラー各種全部削除されて 最初からやり直す仕様なんですね・・・。(成功しても消えるのかもしれませんが)
450 名前:デフォルトの名無しさん mailto:sage [2013/09/11(水) 00:52:29.92 ] ちゃんとリリースノートやインストールノート読んでやってないところ あとはほんとに530のせいかどうかを他のグラボ(nvidiaね)に変えて切り分けして原因しぼっていくしかないだろ。 可能性だけなら グラボ、PCパーツの不良 DLしたソフトウエアの不良 システム不良 などたくさんあんだからさ
451 名前:デフォルトの名無しさん mailto:sage [2013/09/11(水) 02:12:53.82 ] 俺も今5.5のToolkit のインストールでずっこけてる。 Windows XP service pack 3 Quadro FX 580 Toolkit と sample以外はカスタムでインストールできたんだけど、 Toolkitが8割ぐらい行ったところで失敗しました、てなる。 インスコディレクトリにいくらかコピーできてるみたいなんだけど、 環境変数なんかは設定されてない。 リリースノート見てもGUI使うかmsiをシェルで実行しろとしか書いてなくて 困ったぽよ
452 名前:447 mailto:sage [2013/09/11(水) 04:56:20.56 ] もう朝だお。。。 Toolkitのインストーラーが失敗するから ログ取ろうとしたらなぜか成功したっぽい?? C:\NVIDIA\CUDA\CUDAToolkit> msiexec /i "NVIDIA (略).msi" /L*v install.log でも、サンプルのtemplateとか開いてビルドしようとしても 「error : The CUDA Toolkit v5.5 directory '' does not exist.〜」てなる。 環境変数(CudaToolkitDir?)が設定されてないのか、VisualStudioよく分かってないのか・・・。 スレチなら他行きますので・・・。
453 名前:447 mailto:sage [2013/09/11(水) 05:42:32.92 ] ここは俺の日記かお・・・。 VS2012でプロジェクト→プロパティ→構成プロパティ→デバッグ→環境 を選んで編集モードへ。 ここで「マクロ>>」をクリックすると設定されたCuda用環境変数もちらほらありますが $(CudaToolkitDir)の値がからっぽでした。 普通に動かせてる方、この辺の弄り方教えてください。 設定するパスはこれですかね?→C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5
454 名前:デフォルトの名無しさん mailto:sage [2013/09/11(水) 10:14:42.53 ] >>453 うちでは、NVIDIAのGPUが無くてもインストールとビルドできてるよ。(当然、このPCでは実行はできないけど) コンパイラはVS2008 Standard SP1, VS2010 Professional, VS2012 Professional UP3の3つ。 マクロの値は>>453 でok。 OSの環境変数は: CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5 CUDA_PATH_V5_5=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.5 NVCUDASAMPLES5_5_ROOT=C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.5 NVCUDASAMPLES_ROOT=C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.5 NVTOOLSEXT_PATH=C:\Program Files\NVIDIA Corporation\NvToolsExt\
455 名前:447 mailto:sage [2013/09/11(水) 16:32:58.66 ] >>454 ありがとうございます、template動きました。 他のサンプルも手作業コピーで動きました。 # C:\NVIDIA\CUDA\CUDASamples\の中身を # C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.5 # にコピーして、\v5.5\Samples_vs2012.sln開いて全部ビルド成功。 VolumeRenderのfpsが2.1〜2.2の貧弱環境ですが ひと通り習得できてきちんと開発できるようになったら 新しいグラフィクスカード買わないとな・・・。
456 名前:447 mailto:sage [2013/09/11(水) 16:47:38.48 ] 追加質問です。 ビルド中に警告が大量に出ますが、手動インストールによるものなのか判断できません。 > \include\math_functions.h : > warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を > 含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。」 > というのが、たくさん出ます。 普通にインストーラーが成功した方も同じようになりますか? エディタで開いたところ、 math_functions.hはUTF-8N、 cuda.hはSJISと表示されました。
457 名前:デフォルトの名無しさん mailto:sage [2013/09/11(水) 17:16:10.44 ] >>456 > > warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を > > 含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください。」 > > というのが、たくさん出ます。 > > 普通にインストーラーが成功した方も同じようになりますか? CUDAにかぎらず、海外のコードは、よくその警告がでる。 自分は、プロパティマネージャで、C4819を無効にしちゃった。 あと、自分が書いたコードはUTF-8(BOM無し)にしてる。
458 名前:デフォルトの名無しさん [2013/09/12(木) 01:13:44.56 ] すみません。 まだまだ初めたばかりの初心者なのですが、 質問させてください。 Tesla C2075を使っていて、DeviceQuery.exeでスペックを見たところ Total amount of global memoryが1.2GB 程度しかありませんでした。 仕様では5GB程度あるはずなのですが・・・。 OSが32bit(win7)であることが関係してたりしますか?
459 名前:デフォルトの名無しさん mailto:sage [2013/09/12(木) 02:48:14.69 ] >>458 そうかも。 GPUのメモリはPCのメモリマップ上に割り付けられるけど、32bitでは4GBしかないので。 メモリマップは、Windowsのデバイスマネージャで「表示」→「リソース (種類別)」の「メモリ」で判る。
460 名前:デフォルトの名無しさん mailto:sage [2013/09/12(木) 10:32:10.68 ] 64bitでもVRAM全部を割り付けたりしないよ 多分、互換性の為だろうけど
461 名前:デフォルトの名無しさん mailto:sage [2013/09/12(木) 23:42:16.47 ] Windows 7 service pack 1 64bit Geforce TITAN の構成でも試してみたが5.5インストールできなかった。 Windowsでインストーラ使って5.5入れられた人いますか?
462 名前:デフォルトの名無しさん mailto:sage [2013/09/12(木) 23:54:10.36 ] >>454 さんはするっとインストールできちゃった感じなんでしょうか。
463 名前:デフォルトの名無しさん mailto:sage [2013/09/13(金) 00:17:54.99 ] 連投すまん。 Visual Studioが2008 Express しか入っていないのが原因かな?
464 名前:やんやん ◆yanyan/Pails mailto:sage [2013/09/13(金) 05:10:33.37 ] >>461-463 何の問題もなくインストールできたよ
465 名前:デフォルトの名無しさん mailto:sage [2013/09/13(金) 09:34:15.52 ] >>462 >>463 toolkit 5.0, 5.5 はVS StdかProが必要だよ。 4.0, 3.0 は忘れた。
466 名前:デフォルトの名無しさん mailto:sage [2013/09/13(金) 23:20:29.29 ] おかげさまでどうにか自作ソースを5.5でコンパイルするところまでこぎつけました。 インストーラでToolkitとSample 以外を先にインストールして、 Toolkitを単独でインストール、ファイルのコピーが終わったところでこけるので、 >>454 の手順で環境変数を設定して、 Sampleはインストーラを立ち上げて展開されたものを所定の位置にこぴぺしました。
467 名前:デフォルトの名無しさん mailto:sage [2013/09/14(土) 03:24:37.09 ] CUDAでホストのmain関数(グローバル関数の呼び出し込)で時間計測にclock()ってつかって問題あったっけ?
468 名前:デフォルトの名無しさん mailto:sage [2013/09/14(土) 18:37:57.64 ] >>467 OpenMPと一緒に使うとCPUタイムがでちゃって正確な経過時間を計れない場合があります。 精度が1msecというのも場合によっては足りないかもしれません。
469 名前:デフォルトの名無しさん mailto:sage [2013/09/14(土) 22:44:07.90 ] カーネル内でmallocとかnewとかってできる? できるとしたらどのメモリが確保されるん? グローバル?ローカル?
470 名前:デフォルトの名無しさん [2013/09/14(土) 22:52:42.35 ] グローカル
471 名前:デフォルトの名無しさん mailto:sage [2013/09/15(日) 01:00:15.49 ] ワロタw
472 名前:デフォルトの名無しさん mailto:sage [2013/09/15(日) 05:52:52.68 ] CUDA C Programming Guide の B.18. Dynamic Global Memory Allocation and Operations にcompute capability 2.0以上でカーネル内のmallocが使える みたいな事が書いてあるね。GPU側のグローバルメモリじゃないかな。
473 名前:デフォルトの名無しさん mailto:sage [2013/09/15(日) 10:04:46.08 ] >>472 サンクス! GPUのグローバルメモリのヒープ領域(デフォルト6MB)に確保されるのね
474 名前:デフォルトの名無しさん mailto:sage [2013/09/15(日) 13:48:19.08 ] >>468 CPUの方でも処理(マルチスレッドではなく)してるからそういう方式では問題ないってことでいいのかな?
475 名前:デフォルトの名無しさん mailto:sage [2013/09/15(日) 14:55:48.31 ] >>474 だったらたぶん。大丈夫
476 名前:デフォルトの名無しさん mailto:sage [2013/09/16(月) 19:37:26.22 ] カーネル関数でグローバル変数を使う方法ありますか? 渡したい値がたくさんあるのでカーネル関数の引数がかなり多くなってしまい面倒なのですが
477 名前:デフォルトの名無しさん mailto:sage [2013/09/16(月) 21:00:31.24 ] __device__付けたらいいんですね自己解決しました
478 名前:デフォルトの名無しさん mailto:sage [2013/09/20(金) 03:32:59.30 ] グローバル化するより構造体作って引数減らしたら駄目なん?
479 名前:デフォルトの名無しさん mailto:sage [2013/09/20(金) 22:20:48.09 ] >>476 構造体作ってポインタで渡す。
480 名前:デフォルトの名無しさん mailto:sage [2013/09/21(土) 08:08:30.99 ] 構造体渡しはつまり全メンバーコピーだからね
481 名前:デフォルトの名無しさん [2013/10/03(木) 18:57:43.41 ] cudaするのに、11インチくらいのディスプレイのノートPCってあるの? kakaku.comで調べても、14インチくらいのしかないけど、だれか教えてください。
482 名前:デフォルトの名無しさん mailto:sage [2013/10/03(木) 22:45:25.45 ] なぜそこでノート限定なのか
483 名前:デフォルトの名無しさん mailto:sage [2013/10/04(金) 00:18:17.93 ] ちっこいノートはインテルHDグラフィックスなんでねーの? と適当に書いてみる。
484 名前:デフォルトの名無しさん mailto:sage [2013/10/04(金) 07:25:58.57 ] いい加減、グラボを換装できるノートが欲しいよな
485 名前:!ninja mailto:sage [2013/10/04(金) 07:49:10.28 ] 普通にあるけど割高だよ。
486 名前:デフォルトの名無しさん [2013/10/04(金) 08:42:04.48 ] 以前は、IONの載ったちいさいノートPCでCUDAできたのに・・・
487 名前:デフォルトの名無しさん mailto:sage [2013/10/04(金) 21:53:58.77 ] どこかが展示してた外付けグラボが欲しいんだが、発売する気配なしw
488 名前:デフォルトの名無しさん mailto:sage [2013/10/04(金) 23:18:05.53 ] 外付けグラボは過去に何製品か出たけど あまりにもニッチすぎる、発熱や性能の問題でどれもヒットしなかった
489 名前:487 mailto:sage [2013/10/04(金) 23:20:13.46 ] >>488 そうなのかぁ・・・。 残念。
490 名前:デフォルトの名無しさん mailto:sage [2013/10/05(土) 00:05:23.57 ] くだらないしつもんですが、 1デバイス内のグローバルメモリ内でデータをコピーするのに、 cudaMemcpyDeviceToDeviceを使うのと、 カーネルを書くのではどちらが速いですか?
491 名前:デフォルトの名無しさん mailto:sage [2013/10/07(月) 18:54:19.99 ] 簡単なんだから、実測してみたら? コピー専用のカーネル作ってたらロードで不利だけど、メインの処理に抱き合わせるならきっと速いよ。
492 名前:デフォルトの名無しさん mailto:sage [2013/10/08(火) 10:22:41.50 ] >>481 一台GPU積んだlinux機作ってsshできるようにすると快適だよ
493 名前:デフォルトの名無しさん mailto:sage [2013/10/08(火) 17:50:51.74 ] 最近cudaを触りはじめた者なのですが質問があります 多次元配列(2とか3次元)の中で指定した値に一番近い値を抽出する方法をcudaで処理するにはなにが一番適しているのですか? 色々ggってみて、とりあえずソートして絶対値をとって比較すれば良いのではと思い バイトニックソートなどで試そうとしましたがソースコード付の物はどれも一次元配列の物ばかりでどうすればいいのかわかりません それにその方法をとっても総当たりより速度が余計遅くなるのではないかとも考えましたがどうなのでしょうか? 抽象的な質問になってすみませんが誰か回答をお願いします
494 名前:デフォルトの名無しさん mailto:sage [2013/10/08(火) 18:32:54.64 ] >>493 kd木構築してNNでいいんでないの どう並列化するかは細かい状況による
495 名前:デフォルトの名無しさん mailto:sage [2013/10/08(火) 18:39:54.30 ] 総当りを(並列で)やるしかないと思うよ。あれをreductionって言うのかわからないけど。 たとえばMaxを求めるのにソートは必要なくてO(n)でできるのと同様に、 一番近い値を求める(だけ)ならばソートする必要はないはず。
496 名前:495 mailto:sage [2013/10/08(火) 18:43:15.91 ] ああ、多次元配列は変化せずに指定する値をコロコロ変えるなら最初にソートしておけば その後はO(logn)でいけるね。条件次第。
497 名前:デフォルトの名無しさん mailto:sage [2013/10/08(火) 19:37:01.90 ] >>494-496 返信ありがとうございます とりあえず自分の知識が全く足りてない事が分かったのでもう少し色々調べてみます あと、できれば496あたりの詳しい解説を知りたいのですがO(long)とはなんでしょうか?
498 名前:デフォルトの名無しさん mailto:sage [2013/10/08(火) 19:46:50.79 ] >>497 O(long)じゃなく、O(logn)な ロガリズムnのオーダー
499 名前:495 mailto:sage [2013/10/08(火) 19:56:25.36 ] >>497 O(n)とかについては「ランダウの記号」でググるかウィキペディると説明がみつかるはずです。 (ウィキペディアの記事は「一般的なオーダー」よりも前のところは正直俺はよくわからないけど…)
500 名前:デフォルトの名無しさん mailto:sage [2013/10/09(水) 08:46:32.40 ] >>499 了解です 回答ありがとうございました また分からなくなったら来ます
501 名前:デフォルトの名無しさん mailto:sage [2013/10/09(水) 10:13:27.99 ] その多次元配列は、一次元配列に投影できないのだろうか。
502 名前:デフォルトの名無しさん mailto:sage [2013/10/09(水) 23:03:59.00 ] >>501 (i, j, k)の三次元配列だったら index = k * N^2 + j * N + i で一次元になるね。
503 名前:デフォルトの名無しさん mailto:sage [2013/10/12(土) 23:33:36.04 ] Visual Studioでcompute_20,sm_20,-maxrregcount=128でコンパイルしたら, 16 bytes stack frame, 24 bytes spill stores, 12 bytes spill loads ptxas : info : Used 63 registers, 32 bytes cmem[0], 16 bytes cmem[16] ってスピルしちゃうんですが. どこを確認すればいいんでしょうか
504 名前:デフォルトの名無しさん mailto:sage [2013/10/13(日) 04:07:02.74 ] >>503 2.xと3.0は最大レジスタ63個までだから 処理少なくするかコード見直して不要冗長な部分を削るとか あるいはレジスタ制限がゆるい1.xか3.5にする
505 名前:デフォルトの名無しさん mailto:sage [2013/10/13(日) 18:48:01.71 ] >>504 63個までだったなんて知らなかった…. 18K Shared使ってるのと,三次元グリッドなんでCP3.5にしたら,ちゃんとコンパイル通って動作しました. ありがとうございます!
506 名前:デフォルトの名無しさん [2013/10/14(月) 04:34:33.91 ] カーネル呼び出しの行で実行がストップしてしまうのですが(次の行に進まない)、 原因がわかりません。 しかし、nvccの「-G」オプションを付けると、この事象が発生せず、 普通に動作します。 原因のわかる方、あるいは原因の特定方法がわかる方、 教えて下さい。
507 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 10:57:27.12 ] >>506 カーネル内で不正なメモリアドレスにアクセスすると 問答無用で落ちる場合はありますね。 -Gをつけた上で、カーネル実行の後ろに printf("%s\n", cudaGetErrorString(cudaGetLastError()); と入れてみてはどうでしょうか。
508 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 16:11:07.38 ] >>506 >>507 さんが言ってるように,まずはエラー原因を拾ってみると良いのでは? 30: Unknownが出そうな気はするけど. デバッグ情報付与するとメモリ確保位置が異なるので, デバッグ版では偶然に計算に影響を与えない領域にアクセスしていたという可能性も. まず思いつくのは,ある配列の要素Nに対してthreadを生成しているならば, そのthread数がNを超えて生成されるので(BlockDims*GridDims>N), N以上のIdxのthreadが配列外アクセスしてるとか. あとは,カーネル関数内でPrintf()して確認していくとか.
509 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 16:15:22.22 ] >>506 追記 CudaGetLastError()は,カーネル関数がエラー起こしてても拾わない事があるので, そのまえのカーネルが原因という可能性もありますよ. 前に起動したカーネルがあるなら,その後に主要変数をmemcpyして調べるといいのでは?
510 名前:506 [2013/10/14(月) 16:45:39.95 ] 回答ありがとうございます。 >>507 なるほど、メモリアクセスが怪しいのですね。 確認してみましたが、エラーとななっていない事がわかりました。 「cudaGetLastError()」の代わりに、「cudaPeekAtLastError()」でも 試したのですが、エラーとなりませんでした。 >>508 メモリ確保位置が異なるということで、「-G」を付けずに試してみましたが、 やはりカーネル呼び出しの行で実行がストップしてしまい、 エラー取得の行まで進みません。 (ログを入れて確認しました。) 配列のインデックスのバグの可能性があるのですね。 細かく確認してみます。 >>509 問題の起きているカーネルが、最初に実行されるカーネルになります。 カーネル実行の前では、「cudaMemsetAsync」やら「cudaMemcpyAsync」等を 実行していたりしますが、戻り値を確認しましたが、正常値でした。 (ストリームを使っています。) 非同期関数なので、すぐにはエラーがでないそうですが。 この辺も怪しいですね。確認します。
511 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 17:57:20.43 ] >>510 >配列のインデックスのバグの可能性 それはもちろんあるんだけど,ThreadIdxが計算したいNを超えていないか?という事を言いたかったわけで. 例えば8,000個の計算をしたかったときに,1,024Threads/block,8Blockでカーネル起動したとき, 192個余分にThreadを起動しているので,その処理は大丈夫?って意味だったんだけど >カーネル呼び出しの行で実行がストップしてしまい、エラー取得の行まで進みません ホストからカーネル起動したらすぐに次の行にステップして, カーネルの動作は投げっぱなしだったと思うんだけど…違ったっけ? なんか,メモリアクセスエラーよりもカーネル起動すら出来ていない様な気がするので, 簡単なテストカーネル作って起動させて確認するといいのでは?
512 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 18:14:52.48 ] 意外と凡ミスでHW制限越えた値で起動させようとしてるとか パラメータの指定のような気がする
513 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 18:15:28.26 ] c/パラメータの指定/パラメータの指定ミス
514 名前:506 [2013/10/15(火) 01:01:28.01 ] おかしな動作をしている箇所を特定しました。 (「cuda-gdb」で再現しないと、デバッグに時間がかかりますね。。。) ワープ内で32回ループ(ワープ内スレッド数分のループ)している箇所があり、 その中で1つ1つのスレッドが順番に「とあるシェアードメモリ変数」を 書き換えているのですが、別のスレッドが書き換えたはずの値が、 正しく取れていない動作をしていました。 追跡はこれからですが、その後の処理でその変数を使っているところで、 何かしらカーネルが止まる動作になっているものと思います。 とりあえず、その変数に「volatile」を付けたところ、 カーネルが動く様になりました。 まだまだ、これで直ったかどうかは、これからじっくり試験しないとダメですが、 変な箇所が発見できたので、大きく前進しました。 ありがとうございました。 511>> threadIdx/blockIdxについて確認してみました。 大丈夫でした。 カーネル呼び出しは、通常であればご指摘の通りの動作をしますが、 今回のバグでは、カーネル呼び出しで処理がストップしていました。
515 名前:デフォルトの名無しさん mailto:sage [2013/10/15(火) 08:45:34.52 ] >>514 別のスレッドが書き換えたシェアードメモリの内容を参照しょうとしてるの? 排他処理とかどうなってんの?
516 名前:506 [2013/10/15(火) 13:31:30.83 ] >>515 排他処理は、ワープ内の1番目のワープが代表してロックを取っています。 その後、514で書いた32回ループの処理を行い、 再び1番目のワープが代表してロックを解放しています。
517 名前:506 [2013/10/15(火) 21:40:36.51 ] すいません、 ワープ内の「1番目のワープ」とか書いてますね。 誤記です。 「1番目のスレッド」です。
518 名前:デフォルトの名無しさん mailto:sage [2013/10/19(土) 15:35:37.45 ] あるプログラムでビジュアルプロファイラー使ってみたら、 カーネルの実行時間が数マイクロ秒で、 カーネルの起動とcudaThreadSynchronizeの オーバーヘッドが数百マイクロ秒だた。 FermiとKeplerを比べると、 Keplerの方がカーネル実行時間は短くなっているのに、 オーバーヘッドがでかくなって、トータルで遅くなっている。 カーネルの実行時間が数十から数百ミリ秒のプログラムなら 問題にならないんだけど、カーネルちっこいと効率悪い。 エヌヴィディアさん何とかしてください。
519 名前:デフォルトの名無しさん mailto:sage [2013/10/19(土) 20:38:48.02 ] >>518 それはもうGPUの宿命だね。 カーネル起動やデータ転送のオーバーヘッドがゴミみたいなレベルの ど〜んとデカい並列処理をやらすのがGPU。 一時期、AMDがHSAで細粒度並列処理に振ることも検討していたが、 結局、粗粒度での効率を追求するアーキテクチャに絞ったようだ。
520 名前:デフォルトの名無しさん mailto:sage [2013/10/21(月) 21:24:19.54 ] 将来の解決策の一つがハイブリッドアーキテクチャなんだろうなあ レイテンシコアがオーバヘッドのでかい処理を担当するという
521 名前:493 mailto:sage [2013/10/25(金) 16:43:42.75 ] 以前(>>493 )の質問の続きというか似たような質問なのですが誰か教えてください あれから少し調べて配列から二分探索で値を探索し、バイトニックでソートしようと思いcでプログラムを組みました(>>494 に関してはよくわからなったので止めておきました) そこで思ったのですが1*nの配列ならその方法で出来ても目標であるn*nの配列から複数回の入力に近似した値を抽出するという作業を行うにはどうすればいいのかわかりません 自分が考えた方法としては無理矢理配列を1*nに置き換えて探索するという方法ですがそれは処理時間的に有用な方法なのでしょうか? また根本的に探索法の選出に誤りがあるなどの点があれば教えてください 最後にc言語からcudaを適用する際に現状で理解できたのはソートの配列入れ替えを並列化するという点なのですがそこをプログラムとして書くときに注意すべき点があれば教えてください 理解力の乏しい素人の質問ですみませんが誰か回答をお願いします
522 名前:デフォルトの名無しさん mailto:sage [2013/10/25(金) 17:31:46.90 ] ゲームだと処理された画像がすぐに表示されるのに、 GPGPUだとオーバーヘッドが大きいのは何でなん?
523 名前:デフォルトの名無しさん mailto:sage [2013/10/25(金) 18:06:42.51 ] JITしてるから
524 名前:デフォルトの名無しさん mailto:sage [2013/10/25(金) 19:56:16.96 ] >>522 ゲームの場合は、 初期化時にモデルやテクスチャなどの容量大きめのデータをCPUからGPUのVRAMに転送。 ランタイム時はGPU⇔VRAMの広帯域を利用してでモデルやテクスチャなどの容量大きめのデータをやりとりし、 CPU⇔GPUの間(比較的帯域の狭いPCIE)では行列や描画コマンドといった小容量のデータ転送しか行わない。 また、処理結果はCPUに戻さず、GPUからビデオ出力するだけ。 大して、GPGPUでは、 ランタイム時にもCPUからGPUへ処理対象となるデータを転送するため、 帯域の狭いPCIEに頻繁に大量のデータを流すことになる上、 処理された結果をCPUに戻すために往復分の帯域を必要とする。 結局ゲームなどのグラフィック処理がGPU自体はもちろん、 周辺システムに関しても相性の良いアプリケーションとなっている。
525 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 01:04:42.99 ] >>521 何次元配列で各次元の長さはどのぐらいあるん?
526 名前:493 mailto:sage [2013/10/26(土) 03:06:54.12 ] >>525 二次元配列で大きさとしては512*512ぐらいを条件と考えています
527 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 11:10:24.64 ] >>521 まずさ、1次元配列で近似値抽出するコード書きなよ。 それで2次元(というか多次元)配列を1次元として処理するイディオムがあるからそれ使って処理する。 そのイディオムを知らないなら入門書買って読みな。
528 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 14:36:23.97 ] >>526 CUDAのスレッドの生成はブロックもグリッドも 三次元構造までサポートしている。 「CUDA by Example 汎用GPUプログラミング入門」 に画像(2次元配列)処理の例が載ってる。 今扱ってる問題が二次元だったら、 2次元構造にスレッドを起動すればいいんじゃないかな。 配列サイズもその規模なら比較的容易にプログラムできそう。 配列中の一番近い値の検索って要するに一番近い値を 持っているインデックス(i,j)の検索だから、 まず2次元のグリッドで入力値と配列値の差の絶対値を 全要素に対して計算して、 次に、j方向に差の絶対値とインデックス(i,j)をセットでリダクションして、 各iの中の最適なjを見つける。ここの段階でリダクションされたデータは一次元になる。 つぎにiに関してリダクションすれば入力値に一番近い値を持っている インデックスが見つかるはず。 あと、多次元配列と言えどメモリ上では一次元で管理されているから、 コアレスアクセスになるように気をつける必要がある。 まあこれがパフォーマンス的にいいアルゴリズムなのかは責任持てんけどw
529 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 15:11:16.10 ] ふと思ったんだが、C++で (value, i, j)の構造体作って、 そいつの512*512長のvector作って配列の値とインデックス放り込んで valueでsortしてlower_boundとかupper_bound使えば CUDAいらなくね?
530 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 15:47:59.74 ] ふと思ったのなら検証してくれ
531 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 16:53:08.04 ] 速度は知らんけどできると思うよ。検証は知りたい人がやればいいと思う。 >あれから少し調べて配列から二分探索で値を探索し、 >バイトニックでソートしようと思いcでプログラムを組みました とあるけどc(非CUDA)で組んでちゃんと結果はでたのかな? さすがに、実は課題は各要素がスカラーではなくベクトルで、指定したベクトルに (ノルム的に)一番近いものを抽出したかったなんてオチはないと思うけど。 そしたら問題の根本が変わるし。>>493 で「絶対値をとって比較」の絶対値がふと気になりました。
532 名前:493 mailto:sage [2013/10/26(土) 22:19:06.13 ] >>527 回答ありがとうございます お答えいただいた通りまずは一次元でcudaを適用しその後そのイディオムとやらのやり方を調べてみようと思います
533 名前:493 mailto:sage [2013/10/26(土) 22:23:53.50 ] >>528-531 回答ありがとうございます 皆さんの意見を参考にもう少し自分で考えてみます ありがとうございます!
534 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 22:36:50.51 ] そう、自分で考えることが大事だ。 がんばれよ。
535 名前:デフォルトの名無しさん mailto:sage [2013/10/26(土) 22:47:24.53 ] c(非CUDA)で組めてなかったのか
536 名前:デフォルトの名無しさん mailto:sage [2013/10/27(日) 06:17:23.68 ] 非cudaで組まないで、どうやってデバッグするつもりだったんだろう……
537 名前:デフォルトの名無しさん mailto:sage [2013/10/27(日) 22:48:39.68 ] アーキテクチャーが変わるたびに 「既存のプログラムが遅くなった」という悲鳴を聞くのだが、 どうよ?
538 名前:デフォルトの名無しさん mailto:sage [2013/10/27(日) 23:01:38.83 ] どうもこうもない。 各アーキテクチャごとに最適な記述が変わるというだけだ。 そのままのコードで速くなるx86が特殊だと思ったほうがイイ。
539 名前:デフォルトの名無しさん mailto:sage [2013/10/27(日) 23:12:01.87 ] 同じハードウェア・同じソースでSDKのverを上げてビルドすると速度が落ちたというケースも…
540 名前:デフォルトの名無しさん mailto:sage [2013/10/27(日) 23:17:21.49 ] 新しいアーキテクチャーが出てきた時にそれに対応する コードを注ぎ足していければいいのだが、 マクロCUDA_ARCHって使えるの? 定義されてないとコンパイラに怒られるんだけど、 nvccが勝手に定義してくれるもんじゃないの?
541 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 22:40:19.72 ] ダイナミックパラレリズムのカーネル起動コストは ホストからの起動よりも軽いですか?
542 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 22:42:50.37 ] どうして自分で検証して確認しようとしないのですか?
543 名前:デフォルトの名無しさん mailto:sage [2013/10/29(火) 01:13:24.21 ] 既に誰かが試したことを再度試すのは時間の無駄
544 名前:デフォルトの名無しさん mailto:sage [2013/10/29(火) 01:18:03.10 ] 回答を待つ時間は無駄ではないと
545 名前:デフォルトの名無しさん mailto:sage [2013/10/29(火) 01:55:32.53 ] そいつの試験方法が正しいということを証明する方法を述べよ