【GPGPU】くだすれCUDAスレ pert2【NVIDIA】
pert2という時点で
>>1 の頭が超低レベルであることがわかっちゃうけどいちおういっておこう乙
>>5 リンク先を読まずに当て推量で回答。
リビジョンの違いこそあれ、原則同じもの。
勿論、対応さえしていればどちらを使っても同じ。
逆に、NVIDIAのドライバが全く入っていないのなら入れる必要あり。
>>5 取り合えず最新のドライバいれて、CUDAツールキットを入れればおk
リンク読んでねえけど
8 :
5 :2009/10/09(金) 21:08:40
レスサンクスです 具体的に言うとですね。 GeForce 9500M GT の入ったモニタ一体型VAIOがありまして、 それでCUDAってみようと思ったのですが、 CUDAドライバがうまくインストールできなくて、 とりあえず、ツールキットとSDK入れて、 bandwidthtestしてみたら、 認識できるGPUがないとかなんとか(今手元にないのでスマソ) 言われたんですよね。 やっぱCUDAドライバ入れなきゃいけないのかな。
>>8 モバイル版のドライバじゃないとけないんじゃね?
10 :
5 :2009/10/09(金) 23:28:23
Mってのがモバイルみたいですね ノートじゃないから、きづかなかった ちょっといろいろやってみます ありがと
画像処理なんかのサンプルを見ると メモリ転送を行っていないのにカーネル呼び出しの引数になり GPU側で使われている変数があるのですが どのメモリに格納されているのでしょうか filter_kernel<<<grid, block>>>(d_result, d_data, width); こんな感じでwidthのメモリ転送を明示的に行っていないのに使用されています
言葉じゃよく判らん。 もちっと例くれ。 あるいは誰でもダウンロードできるサンプルで説明してくれ
まぁ, __device__ __constant__ __shared__ のいずれかの修飾子の変数が予め確保されてるんだろなー・・・
>>11 配列でない引数はレジスタに入るんじゃないの
引数は勝手に転送される 格納場所はLocal Memory
18 :
5 :2009/10/15(木) 15:35:43
それかもね。ご愁傷様。
20 :
5 :2009/10/15(木) 18:04:53
どんどんダウングレードして、2.0用のCUDAドライバ入れたら入った。 そしたら、今度はなぜか2.2のツールキットとSDKがアンインストールできないヽ(`Д´)ノ エラー6003でぐぐっていろいろやったけど、できない。 アンインスコしないで、2.0インストールしたらまずいですよねぇ 連投スマソ
アンインストールしなくても医院で内科医。
22 :
5 :2009/10/15(木) 21:28:37
>>21 あなたを信じてインスコしたら、
2.0のインストーラーが自動的に2.2をアンインスコしてくれました。
無事2.0環境整いました。
どうもでした(^^
多倍長整数使いたいときは自分で作るしかないん?
cudaに多倍長整数ライブラリは付属していないので、そういうことになりますね。
for文のネストにどこまで耐えられるのかがわからない\(^o^)/ムリポ CUDAのスタックって案外少ない? ハードウェアによってまちまち?
束胃腸やるのはいいが、そもそもキャリーアップフラグとかあったっけ
>>25 template使った再帰もどきとかやらない限り
心配することはないかと思われる。
CUDAカーネルのルーチンはインラインとして扱われるんで、スタックなし。 んでもって、レジスタが使用できないデータタイプだったり、レジスタが枯渇してたりすると、ローカルメモリ(デバイスメモリ)を使用しだすので、パフォーマンスが一気に低下するんで心配してください。
25ですが,みなさんありがとうございます. 最近になってサンプルコードをじっくり読み始めましたが, 自分のやろうとしてるくらいのことは素直に出来そうで安心です. んでもって,もう少しアーキテクチャを知らないといかんな...
31 :
デフォルトの名無しさん :2009/10/20(火) 02:09:58
CPU側のプログラミングにインテルのiccを使いたいのだけど、どこかにやり方は載っていませんでしょうか? OSはWindowsXPです。
32 :
デフォルトの名無しさん :2009/10/20(火) 04:59:45
34 :
デフォルトの名無しさん :2009/10/22(木) 15:51:00
CUDA2.0入れてVS2005でtemplateビルドしたら LINK : fatal error LNK1181: 入力ファイル 'cutil32D.lib' を開けません。 って言われます VISTA64版なので、cutil64D.libはあっても32はないのですが、、 どこを修正すればいいのかもわかりません。 ちなみにVSも使ったことない初心者です どうしたらよいでしょう?
>>34 上のツールバーの真ん中の方にWin32となっているところをx64に変更。
そもそも64bit用のツールをインストールしているかどうか・・・・。
36 :
34 :2009/10/22(木) 23:00:43
>>35 レスサンクス
x64に変更したら、ビルドがスキップされました、、、
プログラマでもないのに、突然仕事でCUDAやってる俺涙目
聞ける人もほとんどいない
ちなみにVSのバージョンは
Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
Microsoft .NET Framework
Version 2.0.50727 SP2
でつ
スレ違い、と言うか人生の道を踏み外したな…。
38 :
34 :2009/10/23(金) 02:37:36
>>37 せめて正しいスレに導いておくんなまし
とりあえずコンパイルできないことには段ボーラーです。
踏み外す以前に舗装道路なんて歩いたことございません。
メモ、とりあえず報告しておきます。
OS:Windows Vista Home Premium 64bit
IDE:Visual C++ 2008 Express Edition
ドライバ:cudadriver_2.3_winvista_64_190.38_general
ツールキット:cudatoolkit_2.3_win_64
SDK:cudasdk_2.3_win_64
ぐらぼ:GeForce 9600GT
で、64bitビルドを行う。
まずは
ttp://www.sharkpp.net/blog/2009/04/26/visual-c-2008-express-edition-enable-64-program.html で64bitビルド出来るようにする。
このまま進めてくと、
nvcc fatal : Visual Studio configuration file '(null)' could not be found
みたいなエラーが出てくると思う。
これを解決する方法が→
ttp://forums.nvidia.com/index.php?showtopic=98319 vcvarsamd64.batは必ず、
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat
か、または
nvcc fatal : Visual Studio configuration file '(null)' could not be found....のところで実行。
後は、nvccのコマンドラインとかちゃんと設定しておけばいける!はず・・・
>>39 の意味はわからないけど、64ビットで使うときは、コンパイルとリンクのオプションに
-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin"
をつければたいていうまくいく。
>>36 その仕事、うちの会社にくれ。あんたがやるより速いものが早くできるぞ。
> VSも使ったことない初心者です でいきなりCUDAか… なんというかどういう会社だと… 「まず32bitで試させてくださいお願いします」 で後から64bitのことを考えたほうがいいんじゃね?
>>36 今、
Windows 7 Professional 英語版
VisualStudio 2008 Pro(C++の64bitツール入れる指定)
CUDA Driver (190.38)
CUDA Toolkit
CUDA SDK
入れて、
OceanFFTのoceanFFT_vc90.slnを開いてx64のDebugでリビルドして
さくっと動いたなぁ、と思ったところですよ。
buildのログには確かに-ccbin "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" と入ってる。
次はCUDA.NETと、PyCUDA+VisualPythonで遊ぼうかなと
>>44 追記... Win7は64bitです。
ToolKitとSDKは2.3です。
46 :
デフォルトの名無しさん :2009/10/31(土) 19:19:26
ボリュームテクスチャをルックアップテーブルとして使いたいのだが cuda kernel上で、tex3D関数を使うと異常に処理時間が増加してしまいます。 case 1 ret=tex3D(tex,yy[0]/256.0-1, yy[1]/256.0-1, yy[2]/10.0-1); case 2 ret=tex3D(0.0,0.0,0.0); で実行時間に10倍以上の差がついてしまうんだがなぜだろう。 メモリ上の配置でかなりパフォーマンスが落ちるということはありますか?
>>46 テクスチャキャッシュにヒットするかどうかでパフォーマンスは大きく変わります。
win7x64にCUDA_VS_Wizard_W64.2.0.1入れてもテンプレに表示されるようになる けどエラーでプロジェクトが生成できない・・・ Vistax64の時はこれで一発だったんだが・・・ 7でも32bitのSDK入れてCUDA_VS_Wizard_W32使ったらすんなり入ったが
>>48 使えると便利だから使えるようになってほしいな。
フォーラム見に行ったら10/31までmergeでdownだよと書いてあったorz
復活したらエラーメッセージをポストしてください
誰かtesla使ってる人いる? tesla一枚挿しのマシンに、リモートからwinデフォのtelnet使って動かそうとすると、 tesla自体認識しないんだが・・これどうやって使うの?
認識してすらいない、っと。
>>50 TeslaがささっているマシンがWindowsなのかどうか読み取れませんが、
リモートからWindowsマシンのTesla使うのであればVNCを使うことが多いですね。
リモートからの利用中心であればLinuxにしてしまった方が・・・。
53 :
デフォルトの名無しさん :2009/11/02(月) 12:21:30
54 :
デフォルトの名無しさん :2009/11/02(月) 12:23:50
逆に、デバイスから高速かつランダムな位置に参照したいときはどのメモリ使えばいい?
>>54 サイズも示さないで高速かつランダムって、馬鹿なの? 間抜けなの?
レジスタに乗るなら1クロックでアクセスできる。
共有メモリに乗るなら4クロックでアクセスできる。
グローバルメモリに乗るならランダムと言う前提からcoalscedであることは期待できないから最長数百クロック掛かる。
>>50 んじゃ私はLinuxサーバ機であるとして。
一部のメーカのサーバ機(BIOS依存かマザボ依存かは不明)ではTeslaをGPUとして認識する。
その場合は(オンボのGPUが切り離されて涙目になることはあっても)なんとかなる。
処が、一部のサーバ機ではGPUとして認識できないので自前でデバイスを叩かないと認識しない。
57 :
デフォルトの名無しさん :2009/11/02(月) 17:33:33
確かにそうだな サイズは20メガバイトくらいだ
58 :
デフォルトの名無しさん :2009/11/04(水) 18:14:36
8800GTXがあるんだが四倍率早く処理するにはなにがある?
ちょっと日本語でOK
8800GTXを4本さす
クロックを4倍に
>>52 レスありがとう。
winでGTX280とTeslaさした状態だと、両方のデバイス認識してて、GTX280外してTesla単体にすると、
Teslaを認識しなくなるんだけど、原因わかる人いる?ドライバではないと思うけど・・
ちなみに、winデフォのリモートデスクトップで確認しました。
DeviceQueryでどうなるのかはっきりして欲しい
>>62 Tesla単体のときって画面は何に表示されるのでしょうか?
TeslaはGPUを搭載していますが、ビデオカードではないことに注意してください。
Windowsの制約で複数ベンダーのビデオドライバを同時にロードできないので
オンボードにATIやIntel製のビデオチップとかがあると駄目です。
どうしてもその構成にしたいのであればLinuxに。
というかWindowsのバージョンによるけどまず無理です。
馬鹿みたいに高いのに、すごい仕様だな
>64 Win7からはWDDM1.1対応ドライバであれば普通に混載できる
67 :
デフォルトの名無しさん :2009/11/05(木) 18:11:37
なんかメモリアロケートのアルゴリズムいじったら五倍以上速くなった、、 あやうく三枚発注するとこだったよ。よかった
CPUの100倍速い、になるまで満足しちゃいかん
将来性は銅なのよ?
GeForce 8600 GT使って、3日目の初心者です。 素朴な疑問なのですが、GeForce 8600 GTには512MBのメモリが実装されているのですが、 cudaMalloc を行って、alloc領域が512MBを超えた場合には、どの様になるのでしょうか? ご存知の方がいらっしゃれば、事象や回避策を教えてください。m(_ _)m
>>70 素朴な通り取れない。
エラーが返ってくるはず。
73 :
70 :2009/11/06(金) 08:35:41
>>71 ありがとうございます。
まだ、某サイトにあった手順でHellow…が出せた段階です。
もしや実装メモリ量を超えると、HDDとの間でガリガリswapでもするのかなぁ?っと思った次第です。
74 :
73 :2009/11/06(金) 08:52:35
うっ… w 綴り違うし orz...
>>73 大丈夫、swapなんてするはずもない。そもそも512MiB全部使えるわけでさえない。
その世代で512MiB搭載のボードなら、実際に使えるのは高々511.69MiBだけだ。
しかも、そのボードを実際に描画にも使っているならそこから更に画面解像度に依存した分使える量が減る。
逆に、目一杯cudaMalloc()で確保した状態で画面解像度を上げたりすると面白いことになる。
>>73 つかQueryつかってデバイスメモリの上限チェックしないと
>>63 ,64
レスありがとう。どうやら、winではディスプレイ出力できるグラボを最低ひとつ積んでないと、
cuda使えないみたいです。つまりTesla単体では動かない。。deviceQueryしても、
there is no device supporting cudaしか返ってきませんでした。倍精度の数値計算したくて
Teslaシングルで動かしたいときは、nvidiaの公式が推奨してるようにLinuxでやるのがベスト
みたいです。いろいろとありがとうございました〜
78 :
デフォルトの名無しさん :2009/11/07(土) 03:56:44
snow leopardじゃつかえないの?
79 :
デフォルトの名無しさん :2009/11/07(土) 06:48:09
80 :
34 :2009/11/09(月) 21:08:31
いまだにtemplateのコンパイルもできません。 32bitコンパイルしようとするとlibがないといわれ、 64bitコンパイルしようとするとスキップされる。 人に聞いたら、ソースが32bit用なんじゃないかって言われた。 ちゃんと64bit用SDKインスコしたつもりなんだけど、 64bit用のソースでなかったりするのでしょうか?
>>80 リンカが言うようにlibのファイルがないんでしょ?
パスが通ってるか、ファイルがあるかどうかくらい自分でなんとかしなよ。
>>81 レスサンクスです。
でも、
>>34 に書いたとおり、32bit用のlibはもともとないんです。
まったく初心者なので、勘違いしてたらすんません。
>>82 それなら、リンカに指定するライブラリをcutil64D.libに変えたらいいじゃん。
>>80 その書き込みから推測するに、出力先にtemplate.exeが存在しているため、スキップされると思われます。
SDKのtemplateをそのまま開いて64bitコンパイルしたいのなら、
出力先のtemplate.exeを削除してからビルドすればスキップされなくなるはずです。
C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\bin\win64\Release\template.exe
私の環境ではこの場所。SDKにはすでにコンパイルされた.exeが入っているはずです。確認してみて下さい。
64bitSDKには32bitのlibが入っていないんじゃないかな?詳しく確認はしていないけれどね。
86 :
73 :2009/11/09(月) 23:08:04
>>75 、76
どうもです。お返事遅れました。
先週はXPでやってましたが、今日からはFedoraに入れ直し実施してます。
結果ですが、画面が点滅したり、真っ黒になったり、となりました。
復旧には、sshで入ってプロセス消してもだめで、結局rebootで…。
ちゃんとsizeみて使う様にします。
m(_ _)m
87 :
74 :2009/11/09(月) 23:11:42
済みません。連投です。
>>79 はぃ、
天然ってより、単に英語は苦手です。
88 :
34 :2009/11/09(月) 23:12:49
exe消してもだめでした、、、 つか、なんかソリューションエクスプローラーのところで template.cuを右クリック→プロパティにした時点で、 「操作を完了できませんでした。エラーを特定できません。」 ってなる(´・ω・`)だめぽ リンカへの指定はちょっと勉強してみます。
89 :
デフォルトの名無しさん :2009/11/11(水) 17:55:34
どうにもうまくいかないので質問なのですが short intでGPUにmemcpyしたデータをFFTしたいのですが、 short intのデータをfloatにキャストするには どうしたらいいのでしょうか? int→floatやfloat→intはプログラミングガイドに載っていた通りできたのですが、 short intだとうまくいかないのは何故だろう…?
>>89 何を試したのかよく分かりませんが、short2型をfloat2型に変換する感じがよさそうな。
プログラミングガイド読んでたらハァハァ(´д`*)してきた なにこの気持ち(*´д`*)ハァハァ
>>90 おかげさまで出来ました。ほんとにありがとう
ちなみに試したのは
__int_as_float(int)のような形式のキャストと
__int2float_rn(int)のような形式のものです。
どちらもshortをキャストしたり、shortにキャストすることが出来ませんでした。
GPUに型変換するのは遅いと思うのだが。
その通りだな、そこで相当なロスが出ると思う
voidでコピーして、floatのポインタで計算すれば良いんじゃねーの? 何か勘違いしてる?
int -> floatのキャストなら1命令だからむしろ速いんじゃないのか アライメントは考慮したほうがいいけど
いやだから、gpuでshort -> intはダメだろ。 intで渡しておいて、int -> floatはイントリンシックで。
別にshortで渡しても問題ないかと。 GPU内でshort -> intの変換をしてから int -> floatの変換が起こりますが、 そんなに頻繁に変換をするわけでなければメモリ転送量の削減効果の方が大きいでしょう。 #32-bitアクセスにするためにshort2型をお薦め。
GPGPUのハードのいいベンダーだか機種だかオススメある? 予算は潤沢にあるとして
NVIDIAのTesla。つーか、Teslaのラック筐体マジお勧め。 漏れなくNVIDIAのサポートがついてくるから。
>>101 CUDAしたいからtesla c1060を搭載した機種を買うのは
当然なんだけど、teslaを組み込んだ
ハード全体としてのオススメを知りたいのでした。
ようするにフラクティカだとかELSAだとか爆速だとか、
どこがいいのよっって話です。
teslaのラック筐体ってなに?
タワー型じゃなくてユニット型がいいってこと?
それともteslaの名を冠したサーバーがあるの?
すまんあんま詳しくないんでわからん
HPC用にTeslaC1060相当を4枚入れた、TeslaS1070っていうラック筐体があるですよ。 当然、PC筐体は別途必要。 PC本体なら、QuadroPlex2200S4ってーのがTeslaS1070にマザボをつけたような仕様だったかと。 ラック筐体じゃなければ、QuadroPlex2200D2がタワー型でGPU2枚挿しのPCになる。 NVIDIAの営業曰く、「GeForceなんてアキバ的発想はやめましょう」ということなので。 # GeForceでいいならELSA辺りがリファレンスボードをそのまま使うから安定しているけどね。 ## つーか、QuadroPlex使うような予算があるならソフト開発受注したいぞw
>105のPCすげぇ。TeslaC1060が4台も載っている。なのにVGAはMatrox。
おまえらどんな仕事してんだよ
自宅の治安を守る仕事
>>106 だってサーバーだから。
すんごくうるさいよこのマシン。標準でリモート管理機能が付いているから、
リモートから電源のON/OFFやキーボード、マウス、VGA、IDEポートの
ネットワークリダイレクトができる。
だから管理用IPアドレスだけ設定してサーバールームに入れっぱなし。
GeForceとQuadroってどう違うんですか??
シールが違う。
>>93-99 色々参考になります。ありがとう
とりあえずそれぞれのやり方で試して処理時間比較してみます。
>>110 書いてあるじゃん。
7046GT-TRF-TC4はサーバーのベアボーン。
箱、電源、マザーボード、ドライブエンクロージャ、そしてTesla C1060 * 4だけ。
あとはCPU、メモリ、ハードディスクを買ってきて刺してやれば動くってこと。
115 :
111 :2009/11/14(土) 01:20:18
>>112 それだけですかw
ありがとうございました m(_ _)m
>>109 自宅にサーバールームか。アニメみたいww
やはりワレワレはコストパフォーマンスの良いものをと考えて… i7-920、12GB ASUS P6T7 WS nForce200が二個乗り とりあえず GTX275あたりを二枚位かな 1000W電源 これでざっと20万コース?
randってつかえないのですか?
>>114 そっか単純にCPUもメモリもついてないのか
安いわけだ
サーバー用のメモリも安くなってきたから、サーバー用でいいかも。 Kingstonの4GB×3本で$350とかだ。
121 :
デフォルトの名無しさん :2009/11/14(土) 05:32:24
CUDA_SAFE_CALLって必ず必要なのですか?
> nForce200が二個乗り おれの場合、O(n^2)だと、使うメモリ帯域<<計算量で、 x16で有る必要は無いなと思ったよ。
カーネルを実行する際に、引数で、変数を渡すことができますが、多数の数値を配列で渡したい場合、 配列をデバイスにコピーしてから、配列へのポインタを渡すしかないのでしょうか? オーバーヘッドの少ない、数値の渡し方を差がしているのですが・・・
引数で配列のポインタを渡したって、どっちみちホストメモリ→デバイスメモリの コピーは要るし?
すみません、CULAについて質問です。 Red Hat Enterprise Linux 5.3(64bit)に まず、CUDA3.2(ドライバ、ツールキット、SDK)をインストール。 (~/CUDA/ 以下。ツールキットは /CUDA/cuda/bin/nvccのようになっている) その後、CUDA3.2上でCUBLASが動作することを確認しました。(Dgemmを利用) 後に、CULAがあることを知り昨日CULA Basic 1.0をダウンロードし ~/cula/ 以下にインストールしました。 (~/cula/lib64/libcula.so) インストール後表示される export CULA_ROOT="/home/nakata/cula" export CULA_INC_PATH="$CULA_ROOT/include" export CULA_BIN_PATH_32="$CULA_ROOT/bin" export CULA_BIN_PATH_64="$CULA_ROOT/bin64" export CULA_LIB_PATH_32="$CULA_ROOT/lib" export CULA_LIB_PATH_64="$CULA_ROOT/lib64"
126 :
続き :2009/11/14(土) 15:43:23
以上を実行後、example/geqrf にある、Makefileを用いて make build64 を実行すると、 /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasDtrmv' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasZswap' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasZaxpy' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasCtrmv' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasZtrmv' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasZcopy' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasCgemv' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasCtrmm' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasCtrsm' /home/nakata/cula/lib64/libcula.so: undefined reference to `cublasZtrmm' リファレンスを調べてみると、例えば、cublasにDtrmvが無いように思えます。 これはどのようにすればいいのでしょうか。
127 :
デフォルトの名無しさん :2009/11/15(日) 15:27:35
en_curr_regionがないってエラー出るんで、調べてたらbreakやcontinueのところでエラー出てるっぽいんだけど、CUDAってbreakやcontinueとの相性悪いのだろうか?
分岐は罪
質問です CUDAを使ったプログラムをCUDA toolkitをインストールせずに実行する方法ってありますか?
試した事はないけど、driverと実行ファイルがあれば出来るだろうな
よ〜し、パパ、CUDAを覚えて会社で活躍しちゃうぞ〜!
VCランタイムがあるとして、cudart.dllと、cutil32.dll だけ必要(Win32)。
cudatoolkitのEULA、cudart.dll はredistributableと書いてあるな CUTILは、cutil.cppの頭に「何の保証もしねぇよ」って書いてある。CUDAとは別で単なるサポート用なのかな。 ていうかcutil32.dllは無くても動くように書けると思う。ソースみたらくだらないぞこれ nVidiaのドライバ入れればCUDAも動く、ようにはまだなってないのかな。
>>134 cudart.dll はCUDAの上位互換を保つために、配布するんだそうだ。
ちなみに、cutil32 or 64 .lib は使わないほうが。。。
ともかく、
cudart's version <= cuda driver's version
の条件が必須
cutilはクソすぐる
Tesla C2050 $2,499 発表になったじゃない。倍精度500-630GFLOPS。 倍精度なら10倍速い、ってどかすか買うお金持ちな人居るんだろうなぁ。
今まで散々売られてもいないLarrabeeを盾にして現存のプロセッサと それを擁護する人たちを馬鹿にしていた癖して いざ完成が近づいてくると ディスクリート版には期待していないキリッ とか馬鹿にしてるよな。
おまえは誰と戦って(ry
書き込むスレ間違えたが分かっている人はいると思うから問題ない。
>>138 倍精度性能だけ見るとHD5870と同じ性能だというのは本当なのか?
単精度の1/2の性能でいいって言ってるけど
HD5870の単精度性能が数倍早いだけだという噂が
>>142 AMDはなにかを犠牲にしていると思うんだけど何を犠牲にしているの?
>>143 たとえばプロセッサエレメントはFP演算とデータの読み書きは排他実行だったりとか
それでなくとも各プロセッサエレメントにぶら下がってる5つの演算ユニットが平均2〜3程度しか稼動してないとか
ららびーは倍精度で1TFLOPSとか行くのかな。 Core i7で60GFLOPSくらいだっけ。
>>144 データ読み書きは別スレッドの分が並列に動くだろ。
メモリアクセス性能低いからALU命令の比率が余程高くないと
読み書き速度がネックになるけど。
初歩的な疑問なのですが
ttp://tech.ckme.co.jp/cuda_const.shtml のコードのように
__constant__ float g_idata[10000];
とか書いた時,このconstantメモリ領域は
いつ確保されるのでしょうか?
宣言だけ書かれてあっても
host,device共にその領域を使うコードを実行しない限り,
領域確保は行われないと思っていいのでしょうか?
>>147 GPUにはそもそも領域確保と言う概念がありません。
定数メモリ領域も共有メモリ領域もただそこにあるだけなので、宣言はあくまでもコード上のものでしかありません。
149 :
デフォルトの名無しさん :2009/11/18(水) 15:16:17
一応タイムシェアリングできてるみたいだけどGPUのメモリ領域の退避はしないの?
CUDAでCPU、GPUを並列に動作させられますか? CPU GPU 並列 CUDA あたりで検索しても出てきません。 原理的にできそうな気もするのですが、 GPUで操作させている間はドライバを働かせているので無理なのでしょうか?
151 :
デフォルトの名無しさん :2009/11/18(水) 18:52:14
スレッドを使えばできますよ。GPUのプログラムは殆んどCPUに負荷をかけません。
>>150 GPUを起動したスレッドを待機状態のまま放置しておけば、他のスレッドでCPU資源を遣り繰りできます。
但し、SPの個数を超えるようなグリッドを食わせると途中で転送処理が入るので要注意。
153 :
デフォルトの名無しさん :2009/11/19(木) 06:44:52
CentOSで動きますか?
FermiでC言語が使えるってどーいうこと?
fermi用のCコンパイラを用意しましたってことじゃねーの?
スレッド内部でレジスタがどのように使われているかわかりません 変数の数=レジスタの数という認識をしていたのですが、そうではないようです どなたかご教授ください
158 :
デフォルトの名無しさん :2009/11/21(土) 10:30:39
159 :
デフォルトの名無しさん :2009/11/21(土) 10:32:29
158です。 上記質問で訂正があります。programming guideのP.139ではなくP.137でした。すいません。
>>158 テクスチャだからとしか言い様が無いような。
配列の[0]の値は0 〜 1が守備範囲で中心は0.5
...
配列の[i]の値はi 〜 i+1が守備範囲で中心はi+0.5
...
配列の[N-1]の値はN-1 〜 Nが守備範囲で中心はN-0.5
N個の値を0〜Nの範囲に均等にマッピングするためにこうなっている。
>>160 なるほど、こんな感じか。
buffer[2.5] = 6.0
buffer[3.0] = (buffer[3.5]-buffer[2.5])*0.5 + buffer[2.5] = 7.5
buffer[3.5] = 9.0
buffer[4.0] = (buffer[4.5]-buffer[3.5])*0.5 + buffer[3.5] = 10.5
buffer[4.5] = 12.0
buffer[3.141592653589] = (buffer[3.5]-buffer[2.5])*0.641592653589 + buffer[2.5] = 7.924777960767
あれ?ちょっと違う値だね
162 :
158 :2009/11/22(日) 15:50:57
>>159 ,160
ありがとうございます。
なんとなく理由が理解できた気がします。
が、こちらでも計算しましたが
buffer[3.141592653589]=7.924777960767
となって件のサイトの値7.921875とは合わないですね・・・
buffer[9.80665]=27.91995となって27.925781ではないですね・・・
低精度の線形補間というのは有効数字3桁って事なんですかね?
リニアフィルタつきのテクスチャでは、 座標(0,0)てのは左上端のドットが持つ四角い領域の左上端を意味するからね。 ドットの真ん中は座標(0.5, 0.5)になる。 真ん中にそのドットの本来の色(値)がくる。 精度はシラネ。リファレンスマニュアルに何か書いてあると思うけど。
CUDA3.2上で動くTesla1070Sを使っているんだが doubleでは、sqrtとか動作しない? //#define DOUBLE double #define DOUBLE float __global__ void sqrtTest(DOUBLE *A) { int x=threadIdx.x; (*(A+x))=(DOUBLE)sqrt(*(A+x)); } みたいにして、実験したんだが、doubleにすると 値がそのまんま帰ってくるんだが orz
>164 コンパイル時に -arch=sm_13 はつけてる?
>>165 それだっ!動作しました。
cublasは倍精度で動いたんで、いろいろ調べたんですが。
ありがとうございます。
>>164 CUDAって3.2までいっているの?
つい最近2.3が出たような気がする。
ひょっとして2.3の間違い?
おそらく。 今は3.0のβだね。
169 :
デフォルトの名無しさん :2009/11/25(水) 03:38:40
newでメモリを確保するのは反則ですか?
>>169 どうやってnewで確保された領域をGPUに転送するの?
>>169 CPU側のメモリでしたら反則ではありません。但し、VCで使う場合は*.cuでnewしてもmsvcrtにリンクできません。
newでメモリ確保するのがだめならどうやってCPU側のメモリ確保するの? 全部静的確保? それともcudaHostAllocを使えって話?
メモリ転送ってSSEで高速化されたりするんかな? だとしたらnewより専用で用意されたものを使ったほうがいいかもね
>>174 メモリ転送ってCPUメモリ間?それともHOSTーGPU間?
前者だったら高速化はされるけど、後者はDMAでPCIEにダイレクトに転送されるだろうから、
SSEは関係ないんじゃない?
これは・・・
108 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/14(月) 19:24:11
>>106 GPUはWarp単位で同じインストラクションが走るから、要は16人17脚みたいに考えればいい。
メモリアクセスを16人17脚によるパン喰い競争みたいに考えると、自分のパンが目の前にある状態がcoalesced。
そのとき、2,3人パンを喰う必要がなくてもスルーするだけだから問題ない。
処が、二人のパンが入れ違っていたらそこで入れ替える間、みんなが待たされることになるって感じ。
# 判っている人には判るけど、判っていない人には判らない説明だなw
>>107 共有メモリを使うかどうか違うだけだと思うけど。ptx出力させて較べてみたら?
109 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/15(火) 00:26:16
>>108 その説明、いただいてもいいですか?
110 名前:デフォルトの名無しさん[sage] 投稿日:2008/07/15(火) 01:56:27
>>109 本にするならもっと書かせてくれw
Vipのwikiに載せるなら是非やってくれ
金取って講習するのに使うのなら分け前よこせw
対称行列になるものをGPUに送信したいのだが、うまい方法はない? 一般の場合は、GPU上では対称ではないとみたいのだが 送る際対称になる場合が結構あって、転送時間無駄だなあと。
このコードはいろいろ酷いからそのまま使えると思っちゃ駄目よ。 srcのアドレスはこの場合64バイトでアラインメントされてないといけない。 destのほうも最低限16バイトアライン
>>176 あと、競争するコースに分岐があったら、
その分岐に用のある人が2,3人だったとしても全員一応付き合わされた後
本流に戻るというか、そんな感じだな。
>>180 ,181
あれ、みんな読んでないのかな。
最近ようやくCUDA本がでたわけだけど、
まんまこの文章書いてあるんだよね。
青木先生乙
地球シミュレータを蹴散らし一躍脚光を浴びたというのに 中身スカスカなスレだなw
CUDAスパコンってそのときだけのものなんじゃない? 研究機関のスパコンは定期的に更新されるもので、更新したら前の代の ソフトウェア資産はさっぱり使えなくなりましたじゃとても困るだろう。
まあG80〜GT200世代のコードも一応次のFermiでは動くし NVIDIAが父さんしない限りはずっと続くんじゃない?
>>182 もうある程度把握しちゃってるからいまさら入門書買ってもとも
思ったけど、どうなんだろ。
×CellやめてOpenCL ○Cellベッタリのコード書くのやめてOpenCL 段階的には切り捨てることも考えられるが いきなりOpenCLで他のデバイスとかいっても、資産が無いじゃん
はじめてのCUDAプログラミング 買った人いる? どうだった?
図書館に頼んだら陳列は来月からと言われてしまった
本なんか読まなくても分かるだろ
日販は使えない会社だ。
>>190 思ったより安かったのでぽちってきた。
ASCII.techの特集も買ったけどアクセスの最適化あたりで苦戦中なレベルなので、
どうだった?とか言われても答えられないかもしれない。
>>184 これ、とんでもない誤報
浮動小数点演算を理解していないバカコミの馬鹿記事
科学技術立国 日本の恥を世界に晒したもの
「ふざけたやつがペンもつな、馬鹿野郎」だ。
浮動小数点数
GTX295と電源買った〜 さて、何に使おうw
っBOINC
200 :
197 :2009/11/29(日) 18:00:24
smokeParticles.exe の動作が 8600GTS より遅く感じるんだがなぜだー
202 :
197 :2009/11/29(日) 18:19:17
>>201 それでも8600GTSよりは早くなるはずじゃない?
あまり詳しくないんで間違ってたらすまん。
>>202 言われて見ればそうだな、約2倍に性能アップしてるはずだし
いつからか分からんけど古いCUDAと最近のCUDAのサンプルプロジェクトが入れ替わってるからな
パーティクル関係の数字が増えてるけど同じプログラムでやってみた?
204 :
197 :2009/11/29(日) 18:37:06
>>203 同じプログラムでやってる。
ベンチマークでもやってみるかな。
文字列処理をさせてはみたものの 遅すぎて使い物にならねーぞこんちくしょー
>>205 単精度な数値計算に変換すれば良いんでないかい
>>206 UTF-8をどうやって数値計算にすればいいぉか?
UTFの全領域を使う分けじゃなければ、必要な部分だけを数値にマップするとか。
文字列処理って言ってもいろいろあるだろ
210 :
197 :2009/11/29(日) 22:02:50
ベンチマークやったら電源が落ちた・・・ 780Wじゃ足りないのかな
>>210 よっぽどの詐欺電源でも買ってない限りは、さすがに足りないってことは無いと思うけど
初期不良じゃないか?
熱落ちじゃないの?
Geforceは80 PLUS シルバー以上の 電源じゃないとまともに高負荷に耐えられないぞ
214 :
197 :2009/11/30(月) 06:48:15
80 Plusって書いてないわ・・・ CORAZON ってやつです。
216 :
197 :2009/11/30(月) 17:40:28
25Aが2つ書いてあるのはどういう意味?
定員25人のエレベーター2基と、定員50人のエレベーター1基は違うというのは分かるな?
HDDとかPCIE用の電源が2本電源の中にあるってことだ ちゃんと分割して接続すれば12x25=300WあるからGTX295のTDP300Wは支えられる HDDとかつけるともう足りない ちなみにうちの700W表記の電源は一本36Aある
219 :
197 :2009/11/30(月) 21:20:06
>>219 検索すりゃわかるが今の電源でGTX295を動かしてる人が居るから動くって
HDD1個にしてみて周辺機器もはずしてOCしてるならデフォルトにして
配線を入れ替えたりしてみてダメなら初期不良だろう
つまり、安いもんじゃないし保障が切れたらもともこもないから 電源が原因だとしても保障があるうちに買った店に持っていって確認してもらったほうがいい お店の人が電源がだめだと言うなら電源を買えばいいし お店にあるちゃんとした電源でもダメだったら初期不良で交換してもらえるからね
222 :
197 :2009/11/30(月) 21:50:02
そうしてみる。 電源も一緒に買ったものだし、持って行ってみるわ。 めっちゃ勉強になった。ありがとう。
223 :
197 :2009/12/01(火) 06:40:06
追記 HDを1つにしたら、落ちるまでの時間が長くなりました
排熱もやばいんだろw きちんとしたケースとFAN買えw
225 :
デフォルトの名無しさん :2009/12/01(火) 17:12:58
多次元配列の領域確保、コピーってcudaMallocとcudaMemcpyでできる?
できる。 てか普通のCみたいにコピーできる。 ちなみにCudaだと多次元配列だと面倒だから1次元配列として扱うことがおおい。 cudaMemcpyAsyncってのもある
面倒っていうか1次元しか扱えないし
1次元だけだったか 自分の技量が足りなくてできないのかと思ってた。
今日からCUDA触ってみたのですが、全然速くない… device側で1MB×2(dest, src)をアロケートして、hostからデータをコピー for (int n = 0; n < 1024*1024; n += 512) { CUDA_Func<<<1, 512, 0>>>(dest, src, nPos); } hostからdeviceへコピー ===== __global__ static void CUDA_Func(BYTE* pDest, BYTE* pSrc, int nPos) { int i = blockIdx.x * blockDim.x + threadIdx.x + nPos; pDest[i] = ((int)pDest[i] + (int)pSrc[i]) >> 1; } ===== なんて事をやっているのですが、CPUの方が速いです Visual Profilerを見ると、各CUDA_FuncのGPU Time は 8〜9us で終わってますが、CPU Timeが80〜150us になってます こんなものでしょうか?アドバイス頂けると嬉しいです Win7/GF8800/SDK 2.3
>>229 CUDA_Func<<<1, 512, 0>>>(dest, src, nPos);を2k回も呼んでるのがまず悪いんじゃね?
あとは詳しい人に任せた。
俺も勉強中。共有メモリのバンクコンフリクトがわけわからねえ。
>>229 そりゃカーネルをキックするコストはかなりでかいから、ループで何回も呼んだらCPUにまけるだろ。。。。
>>230 shared memoryのbank conflictは
ものすごーーーーく大雑把にいうと、thread_id順でshared memoryのアドレスにアクセスすると各バンクのチャネルがぶつからなくて、パラレルに出来るよってお話
232 :
229 :2009/12/02(水) 21:33:41
レスありがとうございます。 リニアに1次元配列を処理するような事は意味がないと言う事でしょうか? 例えば、ある程度の長さの、サンプリング単位のPCMの演算や、ピクセル単位の画像の演算とか…
233 :
229 :2009/12/02(水) 21:40:38
連投スマソ
なんかレスを書いてて、やっとピンと来たんですが、
例えば各スレッドでさらにループで回して、CUDA_Funcを減らせば良い的な話だったりします?
>>229 のコードで言うと
CUDA_Func内で1KB分ループさせて、各スレッドへは1KBのオフセットを渡す。
その分、CUDA_Funcの起動回数を減らす。
違う…?
234 :
初心者 :2009/12/02(水) 21:55:19
>>299 通常CPUなら、forで何回もやるような処理を
CUDAのカーネルを一発たたくことによって処理させるっていうのが基本的な考え方じゃないの?
あと、メモリは一度になるべく大きくとって転送したほうが効率がいいらしいよん
>>233 そのコードを見た感じ、1024*1024*512スレッドつかってることになってるけど、
何をしてるの?
いや
>>229 のやり方は正しいよ
画面描画とCUDAは同期処理だから大きい単位でやると画面がタイムアウト起こす
これ以上の最適化はCUDAでは不可能
これで遅いというならそれがそのカードの性能限界だと考えるしかないな
ちなみに
>>229 のCPUとカードの具体的な名前と周波数と
PCIEの速度とx16 gen2とかね
遅いって実際にどれくらい遅かったのは知りたいね
上位のクアッドCPUと8400GSなんかじゃ勝負にならないのは当たり前だから
>>229 ごめん元のソースが何したいのかよく分からないんだけど、こんなことしたいわけ?
1024ピクセル×1024ピクセルの二つの領域の明るさ平均を取るみたいな?
CPUなら、縦座標が外側ループで1024回×横座標が内側ループで1024回、回ると。
//device側で1MB×3(dest, src1, src2)をアロケートして、hostからsrc1,src2にデータをコピー
//512スレッドを起動するなら、外側ループの回る回数はCPUだと1024、GPUだと1024÷スレッド数512
for (int n = 0; n < 1024 / 512; n ++)
{
CUDA_Func<<<1, 512, 0>>>(dest, src1, src2, nPos);
}
//deviceからHostへdestをコピー
=====
__global__ static void CUDA_Func(BYTE* pDest, BYTE* pSrc1, BYTE* pSrc2, int nPos)
{
int i = nPos*512 + threadIdx.x * 1024; //各GPUスレッドが動き出す起点、縦にずれてるわけ
for (k = 0; k < 1024; k++) //各GPUスレッドは呼ばれると横向きに1024回ループする。内側ループをGPUスレッドで処理。
{
pDest[i + k] = ((int)pSrc1[i + k] + (int)pSrc2[i + k]) >> 1;
}
}
=====
ちなみにこれだといちいちグローバルメモリへのアクセスになるんで、
//Sharedにスクラッチコピー
//スクラッチコピー分だけループ処理
//SharedからGlobalに書き出し
するともっと速くなる
>>238 早けりゃいいってもんじゃないぞ
そんなもん低クラスのカードで動かしたら一発で画面真っ暗だわ
あとsharedメモリはそんな使い方するもんじゃないだろう 毎回コピーしてたらそのコストの方がデカイわな
sharedメモリってあれだ 1スレッドでやる計算が複雑な時に頻繁に変数の値を更新するだろ そういう時にグローバルメモリよりもアクセスが早い一時領域として利用するもんだ こういう計算自体が単純なケースでは効果はない
>>239 別人だけど8400GSくらいだとそうなの?経験上何msを超えるとハングする?
ググルとOSにより2秒や5秒でタイムアウトとあるがギリギリまでやるのはまずそうな気はする。
あ、失礼 coalescedになってなかった。こうかな??
//4回CUDA_Funcを呼び出す方向で。
for (int n = 0; n < 1024 / 256; n ++)
{
CUDA_Func<<<1, 512, 0>>>(dest, src1, src2, n);
}
//nは「縦」の分割数
//512スレッドが連続した512バイトを取り込む。二回動くと、1ピクセル×横に1024ピクセルを処理。
//上に向かって縦256回回る(k)
__global__ static void CUDA_Func(BYTE* pDest, BYTE* pSrc1, BYTE* pSrc2, int n)
{
for (k=0; k < 256; k++)
{
//動き出す起点は各スレッドで1バイトずつずれてる。
int address = n*1024*256 + k*1024 + threadIDx.x;
//1024バイトを512スレッドで処理するので、二回。
pDest[address] = ((int)pSrc1[address]+(int)pSrc2[address])
>>1 ;
pDest[address+512] = ((int)pSrc1[address+512]+(int)pSrc2[address+512])
>>1 ;
}
}
実際書いて動かさないと良く分からないすな。グレーのビットマップ二つ用意してやってみる形かな。
>>242 タイムアウトが何秒とか議論することですらない
マウスすら動かない状態が2、3秒も続くようなアプリはアプリ失格だろ
CPUより遅いくらいの8400GSで動かそうとしたなら2,3秒のフリーズ程度なら止む無し。 クラッシュしてデータを失わせるかもしれないリスクを犯すよりは 起動時に簡単なベンチ走らせて遅いGPUはハネちゃうのもありかな。 8400GSを考慮したせいでミドル以上のグラボの足を引っ張るとか馬鹿すぎる。
プログレスバー表示したら遅くなるから表示しないで画面を固まらせるなんて そんなものは個人で使うだけにするんだなw
ちょっと待て、みんな一台のGPUであれこれやろうとしているのか? それじゃ出るスピードも出ないぞ。
248 :
229 :2009/12/03(木) 10:22:20
皆様おはようございます。そして、レス感謝です。 朝イチで打ち合わせがあるので、結果だけ取り急ぎ報告します。 前のコード 0 memcpyHtoD 332.928 2155.51 1867.52 memcpyHtoD 332.512 1848.49 3403.26 CUDA_Func 10.624 1158.18 3588.86 CUDA_Func 8.864 119.289 (略) 767008 memcpyDtoH 289.504 997.333 CUDA_Funcでループ 0 memcpyHtoD 332.864 2149.65 1815.04 memcpyHtoD 332.512 1792.27 3264.26 CUDA_Func 11235.1 12351.3 28136.2 memcpyDtoH 286.368 1402.62 満足行く結果ではありませんが、速くはなりました。CPUでリニアに処理した方が速いです。AthlonX2 @1GHz〜3GHz あと、気づいたのですが、当方の環境ではRDP経由でCUDAが動きませんでした。ちょっとヤバイかも… 詳細は追ってフォローさせて下さい。
cudaMemcpyは同期を取ってから転送するから、結果の利用のタイミングぎりぎりまで実行を遅らせられれば 見掛け上の処理時間を短縮できるよ。
>>248 RDP経由でCUDAが動かないのは仕様です。
俺もやってみたらこうなりましたが。 Using device 0: GeForce 9500 GT GPU threads : 512 Processing time GPU: 5.406832 (ms) Processing time CPU: 18.742046 (ms) Test PASSED GPU: 78.0000 87.0000 177.0000 1077.0000 CPU: 78.0000 87.0000 177.0000 1077.0000 Press ENTER to exit... カーネルはこう。 __global__ void testKernel( float* g_idata1, float* g_idata2, float* g_odata, int n) { // access thread id const unsigned int tid = threadIdx.x; // access number of threads in this block const unsigned int num_threads = blockDim.x; __syncthreads(); unsigned int startaddress = n * 1024 * num_threads; for (int j = 0; j < num_threads; j++) { for (int k = 0; k < 1024; k = k + num_threads) { unsigned int accessAddress = startaddress + k + tid; g_odata[accessAddress] = (g_idata1[accessAddress] + g_idata2[accessAddress]) / 2.0; } __syncthreads(); } }
//ホストでこうして、 for( unsigned int i = 0; i < 1024 * 1024; ++i) { h_idata1[i] = (float) (66.0 + i); h_idata2[i] = (float) (88.0 + i); } // こう実行。 for (int i = 0; i < (int)(1024 / num_threads) ; i++) { testKernel<<< grid, threads >>>( d_idata1, d_idata2, d_odata, i); } //CPUはこう。Athlon 2.3GHz。 computeCPU(float* idata1, float* idata2, float* reference) { for( unsigned int i = 0; i < 1024 * 1024; i++) { reference[i] = (idata1[i] + idata2[i]) / 2.0; } } これじゃサイズが小さすぎてあんまり比較にならないと思うっすよ。 景気よく4096×4096でやってみるといいかな?
4096x4096でやってみたらだいぶ差が出てきましたよ。 GPU threads : 2048 Processing time GPU: 33.380219 (ms) Processing time CPU: 260.214355 (ms)
accessAddressの計算おかしくありません?
コードちゃんと見て無いけど、floatならGPUでパラで動かした方が速いに決まってる athlon系の浮動小数点演算のコストは、整数演算のざっと平均70倍 intel系は知らないにゃぁ
computeCPU(float* idata1, float* idata2, float* reference) { for( unsigned int i = 0; i < 1024 * 1024; i+=4) { static const __m128 div2 = { 0.5f, 0.5f, 0.5f, 0.5f }; __m128 tmp = _mm_load_ps(&idata1[i]); tmp = _mm_add_ps(tmp, _mm_load_ps(&idata2[i])); tmp = _mm_mul_ps(tmp, div2); _mm_store_ps(&reference[i], tmp); } } あとどっかでprefetchnta噛ませるといいかも。 CPU側は最低限SSE使おうや。 大学関係者も含めて比較用のCPU側コードが酷いのが多すぎる。
>>257 そんなこと言うと、NVIDIAの営業に「そんなアキバ的発想はダメですよ」って言われちゃいますよw
CPU側は、やっぱりCore i7で8スレッド並列とか動かしてあげないとだめじゃね? そんでGTX285と勝負するみたいな。
率直に言って、なんで値段が5倍のTeslaが売れるのか良く分からないのです<アキバ的発想ですが Fermiアーキテクチャも、GeForceが先に出るんじゃないですか? 来年2月くらいでしょうかね。
>>260 そりゃぁ、GeForceが叩き台だモノ。NVIDIA曰く、GeForceよりも信頼性が10倍高いから5倍の価格差はペイできるって発想でしょ。
Engadgetに、米軍が旧型PS3を2000台買ったとか書いてあったよな $200ドルで256MB、100GFlops、て安いのかな?? 10倍して$2000ドル、2.5GB、1TFLOPS、て。どうなんだろ。GPUのほうが安そうな。びみょう?
GTX285とか、240SPに、512とか1024とか2^nで放り込んでもうまく処理してくれるのですか? 半端な部分の処理がどうなるのか心配していると脳みそかゆくなります。
>>264 cudaライブラリが「適当に」割り振ります。グラフィック兼用だと、そもそも全部使う保証さえありません。
信頼性とか保証とかサポートとかの違いか
いや、メモリ搭載量全然違うし。
そうだね、GeForceの方が安いメモリを使っているしね。
はじめてのCUDAプログラミング買ったが テクスチャには触れてないも同然だな。
>>251 実コード動かしたのは乙だけど、なんでデータがfloatになったの?
整数演算だったら、結局ちゃんとコードが書かれていればボトルネックは転送速度であって、
DDR2-CPUとDDR2-(PCI-Ex16)-GPUの比較になりそうな気がする。
CUDAの処理速度を計りたいならまずプロファイラにかけろ。話はそれからだ
>>263 コードの資産の問題なんでしょ。
Cell用に書いていたので、GPUにポーティングする手間を考えたら、
PS3を大量に買った方が安いのでしょう。
もちろんアプリによるけど、PS3は実効性能で100Gflopsはでるけど、
GPUは実効性能で1TFLOPSも出ないでしょ。
自分の経験では、Cellに対して、G200は大体2倍〜3弱倍という感じだった。
Cellはカリカリにチューンしたけどね。
アキバ的発想ではやっぱり、GTX295を二枚というのが現時点ではさいきょうCUDA環境ですか
>>273 GPU内部だけで完結させる処理なら1Tいくかもしれないが
PCの場合はデータ転送がボトルネックになって1Gflopsとかになるが
>>256 Type Zでやってみた。P9500(C2D 2.53GHz)、GeForce9300M GS(8SP)
GPU Threads: 256, memsize = 16777216
Processing time GPU: 81.911575 (ms)
Processing time CPU: 218.790421 (ms)
Processing time SSE: 84.257759 (ms)
Test PASSED
Press ENTER to exit...
ほう
結局さぁ、「ゲーム」だったらCPUで全部演算しようなんて考えるやついないんだし、 別にGPUでやるほどのもんじゃねぇ、ってだけなんじゃないの>229の例
>>274 アキバ的にはGTX295を4枚が最強だけど、
そこまでするならtesla買った方が幸せだわな。
Larrabeeがなんかよさそう
>>271 4096x4096でやってみたら(float)
GPU threads : 2048
Processing time GPU: 33.380219 (ms)
Processing time CPU: 260.214355 (ms)
BYTEにしてみた。4096*4096で
GPU threads : 2048
Processing time GPU: 27.527241 (ms)
Processing time CPU: 345.093292 (ms)
になった。BYTEのほうがCPU遅い…のはこれはこれでよいのかな
>>278 電源がそれだけで1200Wくらい要るなぁ。
1000W電源二台って感じか。うちのブレーカーは間違いなく飛ぶだろう
電子レンジとかドライヤーつけなければいけるだろう たぶん
夏は地獄を見るだろう
CUDAで倍精度演算をしたいと思っているのですが、 ・GeForce GTX 285 ・GeForce GTX 295 なら、どっちがいいですか? また、もっといいものがあれば教えてください。 Teslaは高いらしいのでそれ以外で、お願いします。
>>284 Fermiが出るまで待つ
でなければGTX295でしょうねぇ。(メモリ・帯域幅は小さくても倍精度演算リソースが二倍)
>>285 ありがとうございます。
Fermiがいつ出るかわからない状況なので、GTX295の方向で考えます。
いつ出るか発表されてませんよね?
cudaMallocHostってmallocのラッパーではない? ライブラリつかってて、なぜかcudaMallocHostを指定していて mallocで大丈夫だろうと思ったら動作せず cudaMallocHostなら動作したので。 どう違うの?
>>285 1個づつ付いてるのを2倍って呼ぶのは詐欺くさいですな
>>287 メモリコピーのハードウェアアクセラレートって決まった区切りで始まる決まったサイズのメモリ単位でしか扱えなくて
そういうのを考慮してメモリを確保するんでしょう
>>280 byteこそSSE使わないと。
最大16倍程度は速くなる
1byte単位のストアは部分書き込みになるからあまり性能的によろしくない。 アラインメント境界にあわせて128ビット単位のストアが一番パフォーマンスよろしい #include <emmintrin.h> computeCPU_SSE2(BYTE* idata1, BYTE* idata2, BYTE* reference) { for( unsigned int i = 0; i < 1024 * 1024; i+=16) { __m128 tmp = _mm_load_si128(&idata1[i]); tmp = _mm_avg_epu8(tmp, _mm_load_si128(&idata2[i])); _mm_store_si128(&reference[i], tmp); } }
>>279 最終的にはメモリ帯域ネックなんで同等のメモリ帯域を持つGTXと変わらんと思うよ。
ただ2つの配列の平均取るだけならほぼ帯域ベンチ。
PCIeかGPUのL/S帯域で律速。
キャッシュメモリが256KB/coreほどあって16コアあれば、1024x1024ならキャッシュにほぼ収まるので
それを有効に使って処理を連結していくなら、そこではじめてLarrabeeの旨味が出てくる。
個人的にはN-Bodyとかが良い勝負しそう。
>>293 だんごさんてきにはGrape-DRが
お勧めということですね
多体問題だけやりたいんならいいんじゃね?
>>295 Larrabeeは机上計算だと1コアあたり16並列で15サイクル(+α)くらいで回るんで、かなり理想的なデバイスなんだけどね。
(ただしvrcppsの精度補完ありならもう少しかかる)
298 :
デフォルトの名無しさん :2009/12/05(土) 13:54:20
GTX260 で決まりすよ。18000円なんだから4枚位買えばいい。
読んで字のごとくコンシューマ向けディスクリートはね。 何のためにスパコン向けカンファレンスで発表したと思う? まあなんにせよ「パソコン」に刺さるカードは無くなったな。 PTX2.0の資料請求しとかなきゃ。
301 :
284 :2009/12/05(土) 18:47:17
>>289 っていうことは、285の方がよさそうでしょうか?
メモリの帯域が大きく、こちらの方が使いやすそうな気がします。
デュアルGPUのコーディングも大変そうなので……
>>301 待てるならFermiを待った方がいいよ
倍精度性能はGT200世代はおまけで1個演算機がついてるだけだから期待するだけ無駄だよ Fermi世代から各コアに演算機付けるって言ってるけど、 一般向けには倍精度削ってGF100の名前で出すとか言ってるからどうなるか分からん CUDAに拘らないならRADEON HD5xxxって選択もある GT200世代より倍精度演算能力は圧倒的にHD5xxxの方が高いし ただRADEONはドライバが糞だしCUDAも動かないしいろいろ中途半端 Larrabeeがどうなるかってところか 現状実用的なものは無いから、実験的な目的以外では買わない方がいいし 実験的な目的なら安いやつでいいじゃないかという話になる
Larrabeeはコンシューマ向けディスクリートGPUとしてはキャンセル。 HPC向けには続投しそうだから100万くらい出せば手に入るようになるかもよ?
305 :
デフォルトの名無しさん :2009/12/05(土) 23:36:41
RADEONはFFTを出せないところを見ると行列積が精一杯のようだよ。 GTX280は512bitのバンド幅がどうもよろしくないのでGTX260を奨めます。
もしRADEONで遊ぶなら、現時点ではDXCSでSM5.0のスレッド制御を 使ってどこまでできるかだろうなぁ。 DirectX 11 SDKにFFTのサンプルコードなんかもあるから、持ってる人は色々 ベンチマーク取ってみて欲しいな。
>>304 Tesla by Fermiの値段にぴったり張り付いて売るのがIntel式な気が
しないでもない。そのためにもnVidiaには頑張ってもらわないと!
295だろ、普通に考えて。 スレッド数を多く使える分だけ、高速化が容易 メモリのバンド幅とかよりも重要だと思うが?
迷っている段階なら、とりあえずGTX260を買って試すのがオススメかな
>>307 流石にIntelシンパの俺でも30万は出せない。
Fermi出た時点で一番コストパフォーマンスいいの選ぶわ。
試行錯誤するのにcompute capability 1.3に対応した ファンレスカードとかあれば良いんだけどな。 260や295を付けっぱなしってのは、なんか精神衛生に良くない。
CUDA勉強中の者ですが共有メモリの利用で躓いてるところです。アドバイス頂けたら幸いです。 下記の二つのカーネルでCUDA_karnel_sの方が5倍時間がかかってしまうのですが原因がわかりません。 違いは読み込んだデータをグローバルメモリに保存するか共有メモリに保存するかです。 __global__ void CUDA_karnel_g(uchar4 *vram, int sx, int sy, uint1 *vram2) { int i = threadIdx.x; vram += blockIdx.y*sx; vram2[i] = ((uint1 *)vram)[i]; __syncthreads(); uchar4 px; *((uint1 *)&px) = vram2[i]; unsigned char Y = (unsigned char)(0.2126f*px.z+0.7152f*px.y+0.0722f*px.x); px.z = px.y = px.x = Y; vram[i] = px; } __global__ void CUDA_karnel_s(uchar4 *vram, int sx, int sy, uint1 *vram2) { int i = threadIdx.x; vram += blockIdx.y*sx; __shared__ uint1 shared[125*32]; shared[i] = ((uint1 *)vram)[i]; __syncthreads(); uchar4 px; *((uint1 *)&px) = shared[i]; unsigned char Y = (unsigned char)(0.2126f*px.z+0.7152f*px.y+0.0722f*px.x); px.z = px.y = px.x = Y; vram[i] = px; } まずバンクコンフリクトを疑ったのですがCUDA Visual Profilerでみるとwarp serializeは0で発生していませんでした。 意図的にバンクコンフリクトを発生させると更に10%程遅くなるのでバンクコンフリクトは原因ではなさそうです。 共有メモリは速いはずなのにグローバルメモリよりなぜ遅くなるのか悩んでいます。初歩的なミスだろうとは思うのですが。
>>312 sharedが一定以上多いとOccupancyが下がるから、そこらへんじゃない?
Occupancyは実行効率にダイレクトに効いてくる。
Visual Profilerの実行ログにも出てくるし、SDKのtools/CUDA_Occupancy_calcurator.xlsで試算可能。
Shared Memory Per Block (bytes)のところに16000って入れると良い。(125*32*sizeof(uint1))
ちょっと計算してみると、
スレッドブロックのサイズが512ぐらいならまだマシ(67%)だけど、
64とかだと壊滅的に遅くなる(8%)。
あとpxがアドレス参照でローカルメモリ(VRAM上)に行ってないか心配だ。
314 :
デフォルトの名無しさん :2009/12/06(日) 07:53:46
vram2[i] がレジスタのってたりしないかな。 親から vram3 として渡してみるとか、参照を i+1 にするとか。
315 :
312 :2009/12/06(日) 10:18:05
>>313 仰る通りだったようです。shared[125*32]をshared[32]としたら劇的に速くなりました。
バンクコンフリクトを疑うあまりブロックあたりのスレッド数を32にしてたのも不味かったようですね。まだ未確認。
>あとpxがアドレス参照でローカルメモリ(VRAM上)に行ってないか心配だ。
*((uint1 *)&px) = shared[i] を px.x = shared[i].x;
と書き換えたところ速度アップしたのでその可能性大です。最適化で同じコードになるんじゃね?と勝手に思ってました。
>>314 >vram2[i] がレジスタのってたりしないかな。
このコードは質問のために単純化したものだったのですが、単純化前にでptxファイルを出力して比較したときは
ld.global.u32のところがld.shared.u32に変化しただけでしたのでレジスタにのったり最適化で消えたりはしてなさそうです。
とはいえptxの書式の資料を見つけられなかったので自信ありません。
参照を i+1の意味はちょっとわかりませんでした。すみません。
>>313-314 おかげさまでグローバルメモリより共有メモリが遅いという現象は解決しました。ありがとうございます。
ブロック専用なのにextern __shared__ の構文がなぜあるのか不思議に思っていたのですがこういう理由だったのかと。
しかし大きな共有メモリで遅くなるのは厄介な仕様ですね。
316 :
313 :2009/12/06(日) 16:21:39
>>315 おつ。
勘が鈍ってなくて安心したw
共有メモリは多数のコアで共有される有限リソースだから、そこも一定以下に抑えないといけないって話ね。
あと本当にsharedを使う必要があるのか、一時変数(レジスタ)で済ませられないか?
sharedを使うべきなのは、同時に動くコア同士のやりとりがある場合と、
どう処理を分配してもcoarescedアクセスにできなくて、でもsharedを使えばできるという場合ぐらいかと思う。
あ、そういや、逆にレジスタが多くてOccupancyが上がらない場合の退避用とかにも使えるだろうか?
317 :
312 :2009/12/06(日) 17:53:52
訂正 *((uint1 *)&px) = shared[i] を px.x = shared[i].x;の部分は勘違いでした。
1バイトしか書き換えてないので等価ではありません。無視してくださいです…
>>315 実はどういう理屈で遅くなるのかよくわかってないのですがお蔭様で対処の方法がわかってひと安心です。
最終的にはいろいろな画像処理に使う予定なのでキャッシュ的な使い方をsharedでさせてみるテストでした。
比較のためテクスチャ版とshared版作ろうとしてはまってしまいました。
自宅でGPU4枚とかって人はなにに使うの?
エンコ
ベンチ見てほくそえむ
>>317 ptx出力を眺めれば判るけど、普通のCならできる最適化もGPU向けにはできないことが多いよ。
敢えて言えば、ポインタ変数に尽くvolatileがついているかのように振る舞うみたい。
例えば、
int function(int * foo) {int bar = 3; foo[0] = bar; return foo[0];}
みたいなコードはCPU向けには
{foo[0] = 3; return 3;}
のように最適化されるのにGPU向けには
{foo[0] = 3; return foo[0];}
のように律儀に解釈される。
なので、ptx出力を読めるかどうかは割りと重要かも知れず。
# つーか、メモリアクセスの個数を数えるくらいのことは普通にやってる。
すみません、かなり初心者です。 行ごとに要素数の違う配列をデバイス側に渡したいんですけど、 a=1; //ホスト側 float** mat=(float**)malloc(size); for(i=0;i<num;i++){ mat[i]=(float*)malloc(size / a); a*=2; } //デバイス側 float** mat_d; CUDA_SAFE_CALL(cudaMalloc((void**)&mat_d,size)); for(i=0;i<num;i++){ CUDA_SAFE_CALL(cudaMalloc((void**)&mat_d[i],size/a)); a*=2; } CUDA_SAFE_CALL(cudaMemcpy(mat_d,mat,size,cudaMemcpyHostToDevice)); for(i=0;i<M;i++){ CUDA_SAFE_CALL(cudaMemcpy(mat_d[i],mat[i],size/a,cudaMemcpyHostToDevice)); a*=2; } というようにはできないんでしょうか?
>>322 >CUDA_SAFE_CALL(cudaMemcpy(mat_d,mat,size,cudaMemcpyHostToDevice));
これがいらないんじゃない?
ホスト側のポインタ列をデバイスに渡しても使いようがない。メモリ空間が違う。
324 :
デフォルトの名無しさん :2009/12/08(火) 09:12:09
開発環境の入っていないマシンで動かすには、どのファイルを持って行けばよいのでしょうか?
>>291 個人的な興味なんですけど、CUDA使ってるcodecってなんで速いんでしょうね?
BYTEアクセスじゃ無いとしても、どの部分をGPUでやらせれば爆速になるのか不思議チャンデス
SDKのドキュメントの通りに,VS2005で サンプルプロジェクト template を元に使っているのですが このプロジェクトに新しい.cuファイルを追加した場合に そのcuファイルへの更新がビルド時に察知されません 毎回リビルドすれば一応反映できるのですが 通常のビルドで反映させるにはどうすればよいのでしょうか?
327 :
322 :2009/12/08(火) 15:52:18
>>323 すみません。
抜けてましたが、
>CUDA_SAFE_CALL(cudaMemcpy(mat_d,mat,size,cudaMemcpyHostToDevice));
は、
ホスト側であらかじめ計算を行い、
その結果を初期値としてポインタ列、matに与えた上で、
その値をデバイス側のポインタ列、mat_dにコピーし、
その値を使ってデバイス側で計算をする。
というつもりで書きました。
このようにホスト側で計算した値をデバイス側に渡す時は
どのように記述するのがよいのでしょうか?
{1個、2個、4個、8個、16個、…} みたいなデータを渡したいのかな?? 固めてまとめて渡しちゃったほうがオーバーヘッドが少ないと思います。 トータル何列あるよ、は別にパラメータで渡す。 (実際にCUDAのルーチン書く前に、コピー/戻しの時間を色々計ってみるといいです) cudaMallocしたデータにはホストからは触れないので、 ホストでmallocしたデータ(mat)に計算結果格納 →同じサイズでcudaMalloc(mat_d) →cudaMemcpyHostToDeviceで渡す なのでそれでいいです
329 :
323 :2009/12/08(火) 17:35:58
>>327 >CUDA_SAFE_CALL(cudaMalloc((void**)&mat_d,size));
>
>for(i=0;i<num;i++){
>CUDA_SAFE_CALL(cudaMalloc((void**)&mat_d[i],size/a));
>a*=2;
>}
考えてみるとここも問題があって、cudaMallocということはデバイス側でポインタ列を確保しているんだけど、
そうすると&mat_d[i]というアドレスは、デバイス側にはバッファがあるが、
ホスト側には存在しないから、ここで例外になりそう。
やるならこんな感じかな?↓(未検証)
float** mat_d; // GPU側に確保する(ポインタ列用)バッファ
CUDA_SAFE_CALL(cudaMalloc((void**)&mat_d, count * sizeof(float*));
float** mat_d_tmp=(float**)malloc(count * sizeof(float*)); // ホスト側に確保する。内容はGPU側ポインタ列
for(i=0;i<num;i++){
// GPU側データバッファのポインタを格納
CUDA_SAFE_CALL(cudaMalloc((void**)&mat_d_tmp[i],size/a));
a*=2;
}
// GPU側ポインタ列をGPUに転送
CUDA_SAFE_CALL(cudaMemcpy(mat_d,mat_d_tmp,count * sizeof(float*),cudaMemcpyHostToDevice));
free(mat_d_tmp);
てやっておいて、mat_dをカーネル呼び出しの引数にしてやるとか。
ここまで、バッファ作りしかしてないので、データ転送は別途必要。
たぶん
>>322 の最後4行のとおりで構わない。
ただデータ転送回数多いと多少とも時間かかるから、
>>328 の言うように
固めたほうがベターではある。
330 :
323 :2009/12/08(火) 17:48:04
>>325 あいまいな質問だけど答えてみる。
CPUよりGPUのほうが計算能力の総量はでかいから、本来GPUが速いほうが当然なんだけど、
以下のようなものは遅くなる場合もある。
・計算負荷よりもメモリ転送がボトルネックになるもの
・処理を細かく分解して並列化することが難しいもの
codecなどは、メモリ転送がボトルネックになりやすい傾向はあるものの、
だいたい画面の領域ごとに分解できる処理が多いから、多少とも速くはできるでしょう。
あと速くならない処理はCPU側でやればいい。
>>328 >>329 参考になりました。ありがとうございます!
まだ不慣れなので色々試行錯誤しながらやってみます!
動き検出なんかは当然CPUにやらせたほうがいいぞ SpursEngineなりCellなりがあるならそれでもいいが
>>333-334 流石にGPUだけとは思ってないけど、atomでh264なんかエンコすると日が暮れる勢いだけど、ionプラットフォームだと実用範囲になる。
エンコ中でも完全にCPUを使い切ってないところを見ると、やっぱGPUをかなり使ってるんだなと勝手な想像
IONはメインメモリをグローバルメモリとして使う、つまりマッピングしておけば CPUからもGPUからもフルスピードでアクセスできるメモリ空間を作ることができる。 ION2は買おうかな・・・。
>>336 実際はそんなに甘くはなく、GPUからフルスピードでアクセスするためにはWriteCombinedモードに
する必要があって、それを付けるとCPUからのアクセスが死ぬほど遅くなります。
通常は素直に転送(実際にはメモリコピーですが)したほうがマシです。
低価格で4GB近いデバイスメモリが使えるというメリットはありますが。
そのためのMOVNTDQA/MOVTDQだろう。 まあ前者はSSE4.1でないと使えないがな。Atomは仕様不可。あしからず。
それらを使っても十分に遅いと思うのですが。
WCにしつつ、CPU->GPUはmovnt*でcopyすれば良さそうだね。 CUDAとか知らないけど:b
>>339 だからCPU専用のワーク領域と分けて読み書きを最小限にする。
>>337 そか、CPUのキャッシュが使えなかったね。
死ぬほどまで遅くなるとは思ってなかった。
GTX295 Vista x64 CUDA2.3 の環境で、CUDA VS WIZARDで作成したプロジェクトを使っています。 質問1. ブロックあたりのスレッド数を512にすると計算結果が正しくなりません。256なら正しいです。なぜでしょう? shared memory はグローバル変数として宣言して、各スレッドで共用(リードオンリー)しています。スレッド内で__shared__の宣言はありません。 質問2. 完成したので、SDKのsimpleMultiGPUを参考にGPU 2個使おうとしています。 とりあえずマルチスレッド用の空の関数を書いたところ、コンパイルはできるのですが、リンクできません。 cutStartThreadなどが外部で定義されてないと言われます。 simpleMultiGPUはビルドできるので、プロジェクトのプロパティを見比べてみましたが特に違いは見あたりません。 何が悪いんでしょうか? どなたかお助けください。
>>343 ・sharedにはCPUから書けませんが、各スレッドがリードオンリーならどこで書き込んでいるのでしょう。
・cutで始まる名前の関数はcutilライブラリ内にあります。cutilライブラリもビルドし、あなたのプロジェクトからリンクできるようにしないといけません。
>>344 上については、言葉足らずでした。カーネルの最初に
if( threadIdx.x == 0 ) { /* デバイスメモリからコピー */ }
__syncthreads();
でコピーしています。
将来的にはコピーも並列化する予定です。
下についてはありがとうございます。既存のlib(dll?)だけでは駄目だってことですね。
threadIdx.xはスレッドの識別子で、実行順番とは無関係では?
共有メモリのつくりに関する知識が思いっきり欠如していると思われ。 threadIdxが0の人だけが書こうとしたら、他の人はみんな何もできなくて時間が無駄。 おまけに、スレッド数が一定数を超えると(GTX295の場合は256か)、別の実行単位になってしまうから(表に見えない) 共有メモリ間転送が行なわれてしまってその点でも時間の無駄。 尤も、>345の様にthreadIdx0でしかコピーしない場合は転送は発生しない代わりに結果がご覧の通りなわけで。 どうせthreadIdx0がコピーしている間他はなにもできないんだから、一斉に同じものを書いてしまえばいいんでない?
>>347 > threadIdxが0の人だけが書こうとしたら、他の人はみんな何もできなくて時間が無駄。
開発途中なので、とりあえずこうしているだけです。
将来的にはコアレスにします。
> スレッド数が一定数を超えると(GTX295の場合は256か)、別の実行単位になってしまうから(表に見えない)
512で上手くいかないのはこのあたりが原因のようですね。
>>347 たびたびすみません。
「別の実行単位」の意味がよく分からないのですが、
要は1つのブロックが2つのSMに割り当てられるって意味ですか?
>>345 Sharedは文字通り、共有できるメモリなので、
各スレッドが1ワードずつ協力して作成→どこでも読み書き可能、
ですよ。0番スレッドだけに任せなくてもいい
自分は
>>343 じゃないけど256スレッドでOKで512スレッドで計算結果がおかしくなる理由がわからない。
>おまけに、スレッド数が一定数を超えると(GTX295の場合は256か)、別の実行単位になってしまうから(表に見えない)
>共有メモリ間転送が行なわれてしまってその点でも時間の無駄。
というのは時間の無駄を指摘してるだけで結果がおかしくなる理由ではないという認識なのですがあってますか?
この時の共有メモリ間転送というのは別の実行単位に転送しているということ?
>>343 256スレッドでやればOKなのでもう興味はないかもしれないが、シェアードメモリの代わりにグローバルメモリで
共用して計算した場合は512スレッドの時も結果は正しくなるのですか?
>質問1. ブロックあたりのスレッド数を512にすると計算結果が正しくなりません。256なら正しいです。なぜでしょう? カーネルコールの後でエラーキャッチのコード入れてる?エラー出てない?
質問の傾向をみると、 CUDAって、普通のCのように自由度高く書けるけど、 実際は、サンプルソースからは読み取れない あれは駄目、こうしたら駄目、的な制約が多すぎるのかな? DXAPI+HLSLのような、自由度の少ない環境の方が むしろ、良質なソースが書けるのかも。
参考資料 Device 0: "GeForce GTX 295" CUDA Driver Version: 3.0 CUDA Runtime Version: 2.30 CUDA Capability Major revision number: 1 CUDA Capability Minor revision number: 3 Total amount of global memory: 939524096 bytes Number of multiprocessors: 30 Number of cores: 240 Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 16384 bytes Total number of registers available per block: 16384 Warp size: 32 Maximum number of threads per block: 512 Maximum sizes of each dimension of a block: 512 x 512 x 64 Maximum sizes of each dimension of a grid: 65535 x 65535 x 1 Maximum memory pitch: 262144 bytes Texture alignment: 256 bytes Clock rate: 1.24 GHz Concurrent copy and execution: Yes Run time limit on kernels: No Integrated: No Support host page-locked memory mapping: Yes Compute mode: Default (multiple host threads can use this device simultaneously)
>>353 CUDAをただの言語だと思っていてGPUのアーキテクチャを理解していないからかと。
後半については同意。限られた記述で実装可能なアプリしか書かないからというのがより正確かも。
356 :
343 :2009/12/11(金) 00:35:49
>>351 スレッド数512、デバイスメモリ使用でやってみましたが、やはり正しくありませんでした。
Emuではちゃんと動くので、原因はよく分かりません。
コンスタントも使って多のでそっちが原因かも知れません。
分からん。もういい。
>>343 の質問2については、multithreading.cppをプロジェクトに追加してないだけでした。
俺死ね。
>353 テクスチャはまじで鬼門。 凝った使い方をしようとすると、コンパイル通っても動かない・動いても結果間違ってるがざらにある。
>>357 あるある。
deviceemuともまた動作違うこと多いしね。
NEXUS出ればデバッグもうちょっと楽になりそう。
>>343 歩留まり向上のため、重い処理をさせると計算が狂うことがあるらしい
どこかのPDFで見た
>>359 それちょっと表現が微妙に誤解を招くような・・・。
出荷されている状態で、計算がまともじゃないコアがたまにまぎれこんでいる。
グラフィック用途と違って、メーカーの想定より負荷が偏った計算をさせることがあるから、
やや耐性の低いコアの耐性がちょっと足りない部分がエラーを起こす。
高負荷プログラムなんかを使ってそういうコアというか製品をはじいてやれば、あとはほぼ安定稼働する、という話だと思う。
はじめてのCUDAがいつまでたっても届かない 一体どこに発注したんだよ上の人
>>360 CUDAのスパコンで1/6が不良品だったと言ってたが
えっ Teslaとかでもそうなのか??
Teslaは選別品
低価格帯で一番安定してるGPUってなに?
CUDAは保障外だからCUDAやりたい奴は動くのが当たるまで買えってことなんだろう
仮に2/3超の確率で完動しないとしても、自前で問題無く選別できるなら Tesla買うよりコンシューマGPU買うほうがまだ安い位だから、たくさん 買う人は自前で選別できるように頑張るのが正解だよなぁ。
多少クロック落とせば動くんじゃないのかな。CPUのオーバークロックと一緒で。
>>361 自分は11/27楽天でぽちって 12/01に到着。
ぼちったあとすぐ納期の表示が延びたから焦ったけど滑り込みセーフだったらしい。
書いてあることはわかり易い。しかし意外なことが触れられていなかったりする。
>>360 その状態が続く限り、コンシューマ用パッケージソフトじゃGPGPUを使えないね。
「動かない」サポートの爆発でたいへんなことになる。
てか
>>356 の作ってるソフトが選別ソフト代わりになるんじゃね?
おれらまだまだ、「主メモリ側が主役」って固定観念なくね? いかんな。どかどかデバイスメモリにロード、大量のブロック×スレッドを駆使、 CPUはたまにお手伝いをさせていただく、位に思わないとな。俺まだまだ
メモリ転送と計算を非同期で出来るのかね?
>>374 マルチスレッドで、CPU側は「GPU様が計算し終わるまで寝とけや」くらいの扱いにするわけよ
>>374 できる。
基本GPUとCPUでは非同期。
ストリームを設定すれば、GPUで演算中にデータ転送させることも可能。
ちゃんと同期させるための関数もある。
> NEXUS いつ出るんだっけ VisualStudio2008でいいんだっけ
378 :
デフォルトの名無しさん :2009/12/15(火) 06:00:58
カーネルで計算した結果をCPU側に返すにはどうしたらいいの? return aのように簡単にはできないのですか?
>>378 ちょw
カーネルfunctionの引数で float * outdata
とかやってカーネルからこれに書き込む outdata[i] = result;
ホスト側でcudaMemCopyのdeviceToHostで、ホスト側でcudamallocしたfloat * に戻す
みたいになる。ややこしいぞ?
thrust便利だなしかし
thrust、自分で書いたカーネル関数はどう使うのっすか
__shared__ int sh[num*2]; /* numはスレッド数 */ という共有メモリの配列をソートし、最大or最小のデータのみグローバルメモリに書き込みたいのですが これをカーネルの中でやるいい方法を教えてください。
ソートは不要で、reductionで半分を繰り返せばいいのでは
>>383 言われてみればそうですね。
解決しました。thx
どこかにfortranでの使用例って ありませんか
そういえば見かけたことねえな
CUDAはそもそも実行速度がシビアで 高級言語向けではないと思うけどな
共有メモリは16個のバンクに分割されて、半ワープのスレッドが同じバンクにアクセスしなければ競合は起こらない。 みたいな事の意味がイマイチ分かりません。 例えばブロックの共有メモリが8KBなら0.5KBづつに分けられて、半ワープのスレッドが0.5KBの中ならどこにアクセスしても良いって意味なの? それとも、先頭から4バイトとか8バイトとかの固定の領域に連続して分けられてるの? でもそれだと分けられる領域が4バイトなのか8バイトなのか分からないじゃまいかヽ(`Д´)ノ カーネルの引数にvoid*とデータサイズを渡して任意のデータ長で処理させたいのですが、 こういう事をしようとすると元からバンク競合は避けられないのですか?教えて、エロイ人(´・ω・`)
今あるMPIのプログラムをGPUに対応させようと考えているんだけど、 CUDAでMPIを使うとき、データの転送は一端ホスト側のメモリに転送してから 他のノードへ転送することになるの? だとするとレイテンシがすごく大きそうだね。 それとも専用のライブラリなんかあるのかな? GPU側のグローバルメモリがホスト側のメモリにマップされていれば、 GPUを意識しないで転送ができそうなんだが。
>>388 おれの解釈だと、共有メモリには16個のアドレス入力と16個のデータ入出力が有る
と思ってるんだけど 違うかも
>>388 連続する64バイトの領域(先頭アドレスが4の倍数)について、4バイト(32bit)のバンク16個に分かれています。
例えばバンク0に属するアドレスは0、64、128、192、256、・・・・・から始まる4バイトの領域。
任意のデータ長が4バイトより大きいのか小さいのか分かりませんが、テンプレート等を使う場合には
型に合わせて場合分けをする必要があるでしょう。
>>390 「1個のアドレス入力と1個のデータ入出力ができるバンク」が16個あるというのが適切な表現かと。
>>389 device memory on node 0 -> host memory on node 0 -> host memory on node 1 -> device memory on node 1
となるのでレイテンシは大きくなります。今のところCUDAではデバイスメモリをメモリマップする手段はありません。
ただし十分大きなデータを転送する場合にはパイプラン化すれば問題なくなると思います。
むしろpinnedメモリとMPIライブラリの干渉が一番の問題・・・・。
>>392 レスサンクス
やはりレイテンシは大きいのだね。
目的のアプリは数10kbyteから数100kbyteの転送を頻繁に行うから、
せっかくGPUで速くできても、転送ボトルネックで詰まりそう。
転送するサイズも小さいので、page lockさせない方がよいのかも。
GPUの購入で悩んでいるのだが、 Tesla C1060, GTX295,GTX285のうち結局どれが 速いんですか?ちなみに流体に使います。 GTX295ってGPU2基積んでるけど並列プログラミング しないと2基機能しないとか? 素人質問で申し訳ない。 Teslaの保証とサポートも魅力的だが。
>>394 メモリ量でC1060になっちゃう なんてことないかな?
295はちゃんとマルチスレッドでプログラムしないと二基使えないです。
>>390 >>391 なるほど…よく分かりました。レス感謝。
処理させたい任意のデータ長は5バイトだったり、11バイトだったり半端な数もきます。
任意のデータ長に対してコピーやビット演算を行なうんですが、データ長が4バイトより大きいと
もうバンク競合は避けられない感じなんですね。
プログラムも汎用にさせたかったけどここは我慢するしかないのか…(´・ω・`)
VCでプロジェクト作るのが面倒なんだけど、 なんかウィザード的なものはないのかな
おいらも流体で使う予定だが GTX260を二つ買ってCUDAのお勉強しつつFermi待ち C1060とか中途半端に高いからねえ
Nvidia寄りのとある企業のエンジニア曰く、 スペックはまったく同じでGTX285のチップの選別品だといっていた。 クロックがGTX285のほうが高いし、GTX285のほうが若干早いかも。 でもこのスレでもあるように、なんか計算結果がずれる可能性があるし、 メモリの多いTeslaが使えるなら使いたいよね。
401 :
デフォルトの名無しさん :2009/12/20(日) 16:53:55
DodでさえIBM CellじゃなくてPS3を購入してるんだからGTX285で十分でしょう。
>>396 ASCII本の絵がわかりやすいけど、
共有メモリーは[16][17]にすれば問題ないと思う。
共有メモリーは無駄飯食っている用心棒みたいなもんで、
冗長にしてでも使えるときに使わない手はない。
404 :
394 :2009/12/20(日) 22:43:43
皆さん、レス感謝です。 なるほど、GTX285とC1060差はさほどないんですね。 メモリと耐久性とサポート,計算結果 に関してはTeslaが有利というわけですな。 とりあえずGTX295のマルチスレッドはちょっと遠慮しようかなと思います。 もうちょい1人で悩んでみます。
個人的には285の2GBメモリ版がお薦めなのです。
406 :
デフォルトの名無しさん :2009/12/21(月) 06:47:28
407 :
デフォルトの名無しさん :2009/12/21(月) 07:04:05
>>405 どっか、285の4GB版とか安く出してくれないもんかね。
...| ̄ ̄ | < Fermiはまだかね? /:::| ___| ∧∧ ∧∧ /::::_|___|_ ( 。_。). ( 。_。) ||:::::::( ・∀・) /<▽> /<▽> ||::/ <ヽ∞/>\ |::::::;;;;::/ |::::::;;;;::/ ||::| <ヽ/>.- | |:と),__」 |:と),__」 _..||::| o o ...|_ξ|:::::::::| .|::::::::| \ \__(久)__/_\::::::| |:::::::| .||.i\ 、__ノフ \| |:::::::| .||ヽ .i\ _ __ ____ __ _.\ |::::::| .|| ゙ヽ i ハ i ハ i ハ i ハ | し'_つ .|| ゙|i〜^~^〜^~^〜^~^〜
めるせんぬついすた、GPU版の使い方@Windowsがやっとわかったわー
|┃三 /::::::::ハ、\、::::::::\\::::::::::::', |┃ i:::::::イ `> ー─--ミ::::::::::::| |┃ {::::::::| ::\:::/:::: \:::リ-} ガラッ. |┃ ',::r、:| <●> <●> !> イ |┃ ノ// |:、`{ `> .:: 、 __ノ |┃三 |::∧ヘ /、__r)\ |:::::| |┃ |::::::`~', 〈 ,_ィェァ 〉 l::::::》 <フェニミストはまだかね 辛抱たまらん |┃ |:::::::::::::'、 `=='´ ,,イ::ノノ从 |┃三 ノ从、:::::::::`i、,, ... ..,,/ |::::://:从
おれの物欲も辛抱たまらん、Core i7+GTX260Mノートが欲しくて。 でもFermiのモバイル版が乗ったノートが出るのを松
故あってCUDAを使うことになったのですが自宅にはRadeonを積んだものしかありません。 コンパイルオプションでCPUでのエミュレーションができると何かで読んだのですが これを利用すればRadeonの環境でも一応の動作はするのでしょうか?
CPUでのエミュレーションなので radeon関係なくCPU上で動くよ
即レスどうもです。学校には設備があるので問題ないのですが自宅でもやりたかったので あともう一つ質問よろしいでしょうか。VineLinuxでの動作は可能でしょうか? 気になったのですがどうもサポートしてないようなので
>>412 悪魔:「単精度なら大して変わらないんだから、買っちゃえよ!Fermi出たらまた買えよ!」
>>415 Linuxでサポート期待しちゃいかんだろう
あとエミュレーションはテクスチャ周りなど微妙に?おかしい模様なんで、あんまり期待しないほうがいい。
5000円くらいで適当なカード買うのが一番無難かもよ。
なんか、GeForceの在庫がどんどん無くなっていってない? まもなくFermi出るな!これは!
>>415 とりあえず玄人思考のGTX260でも買ってみよう
でかいからPCケースに入るか確認してからね
Device 0: "GeForce 8600 GTS" Total number of registers available per block: 8192 CUDAやろうと思ってますが、レジスタの領域が少なすぎませんか? __device__ void swap(float *d1, float *d2); 例えばこのような関数呼び出すのに引数とtempで計12byte、他にもthIDや作業用でローカル変数使うから、 最大のパフォーマンス求めようとすると実質スレッドは300個くらいになるんだけど… こんなんだと何万、何千のスレッドとか無理じゃね? みんなカーネル以外の関数は作らずにカーネルの中に処理を直書きしてるのですか?
>>421 レジスタとスタックとかバイトとレジスタ個数とかごっちゃになってないか色々と
>>421 >Device 0: "GeForce 8600 GTS"
>Total number of registers available per block: 8192
直訳すると、「ブロックあたり使用可能なレジスター数:8192」
ブロックあたりのスレッド数は数千・数万もいらない。
128〜256程度でだいたいパフォーマンスは出る。(それを複数コアで何セットも同時に動かす)
あとカーネル1個でなんでもかんでもするもんでもない。(直列的な)処理ごとに分割すればいい。
426 :
421 :2009/12/27(日) 23:15:38
>>422 >>425 うん…見直すと自分とても恥ずかしい事言いましたね(´・ω・`)
当初の疑問は理解して解決しました。
で、また別の話のGPGPUに関して質問です。
今DirectX使ってゲームを作っていて処理の重い部分(当たり判定とか)をGPUにやらせようと思っているんだけど、
ゲームって元々グラフィック描画でGPU使うので、それに加えてCUDAやプログラマブルシェーダーでGPGPUしたら相当パフォーマンス落ちますか?
目的はCPU使用率を抑えたいんだけど、ゲームのような1フレーム毎にGPGPUをするのは実用で使えうるものなんでしょうか。
当たり前の話だけど、GPUをフルに使うようなレンダリングをしていたら遅くなる フレーム枚にGPGPUの処理を入れるのはそんなに問題ない ただし処理の重い部分ってのが上手く並列化できるアルゴリズムであることや、そこそこの量あることが求められる 分岐ばっかだったり、処理よりメインメモリ-VRAM間の転送のほうが時間かかると逆に遅くなる ようは、本当にGPGPUを使ったほうがいい処理なのかを吟味する必要がある
質問です。
C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\src\template\template_vc90.vcproj
を開き、ビルドした所、「入力ファイル 'cutil32D.lib' を開けません。」というエラーが出ました。「x64」では、スキップされてしまいます。
>>34 とほぼ同じ状況なので、このスレに書かれている事をしてみたのですが、変化ありません。
また、リンカの設定でcutil32D.libをcutil64D.libに変えた所、x64でビルド出来るようになったのですが、
「モジュールのコンピュータの種類 'x64' は対象コンピュータの種類 'X86' と競合しています。」と別のエラーが発生しました。
環境は
windows7 64bit
Visual C++ 2008 Express Edition
GTS250
CUDAのドライバ、toolkit、sdkは2.3でwin7 64bitの物を入れました。
改善策がありましたら、ぜひお願いします。
>>429 みたいです。やはりproを買うしかないのでしょうか…
レスありがとうございました。
>>428 >>430 答えるのに十分な情報量を持った質問を久しぶりに見たような気がしたw
proが良いけどねぇ。
今は最適化コンパイラもついてるし、standardで良い気もする。
(standard使ったことはないので参考まで)
PlatformSDKにx64コンパイラあったような
落ち着いて、なぜこういうエラーがでるのか? と、考えるしかないよ。
CUDAが使えるGPUが載ってるか否かの判断をプログラム上で行うには どうするといいのでしょう?
OpenCL入門 - マルチコアCPU・GPUのための並列プログラミング
が出版されるそうな
アスキードットテクノロジーズの記事書いた人たちらしいが
GPGPUでもっともメジャーなのはCUDAだと思うけど
OpenCLがこの本の売り文句通りスタンダードになるんだろうか…?
よくわからないけど、無関心でいるわけにも行かないのでとりあえずポチってみる
感想あったらアマゾンのレビューに書く
>>434 プログラム上でその判断をやる必要というのがよくわからない
コマンドラインでやるのでは駄目なのか
>>434 それはやはり
cudaGetDeviceCountして、CUDAデバイス個数調べ
cudaGetDevicePropertyをDeviceCountまわして、
.major、.minorでバージョンチェック
.multiProcessorCountでコアの個数調べ
して使うしかないんじゃ。
437 :
434 :2009/12/29(火) 12:21:50
>>436 どうも
>>435 CUDA依存部分を共有ライブラリの形でプログラム本体から切り出しておいて、
実行時に動的にリンク出来たらとか考えてます。
…CUDA版バイナリと、CUDA無し版バイナリを用意して、インストール時に
選ばせればいいのか。
>>435 スタンダードはどう考えてもDirectComputeだろ。
いまのWindowsのシェアとDirectXの普及率から考えてCUDAがスタンダードになるにはポテンシャルが違いすぎる。
439 :
438 :2009/12/29(火) 13:06:36
CUDAはスタンダードになれる可能性はあるけど、OpenCLはたぶん廃れる。 OpenCLって所詮はCUDAのラッパでしょ? ラッパライブラリがスタンダードになった事例ってあんまり知らないんだけどさぁ。
Appleはラッパ好きだよな。 ObjCもラッパではないにしろマクロ駆使してるだけで、骨はCに変わりはないでしょ? Appleは声は大きいけど技術が無いから、OpenCLもあんまり期待してないよ。 所詮ラッパライブラリだから、コンパイルしたらどのGPUでも使えるってわけではないし。 OpenCLのDLLロードしたらどのGPUでも同じバイナリでおkみたいになったら使いやすいけどね。
てか俺が作っちゃう?www
>>437 436でCUDA使えるかどうか確認して、
プログラムとしてはCPU用ルーチンとGPU用ルーチンを両方持っておく
でいいんじゃね?(やはり、動作確認用にCPU/GPU双方で試すのは必要と思うし)
pyCUDAってどうかな DriverAPIを使ってモジュールを実行時に作成、ロードするみたいですね。
3次元のデータをデバイス側に送って計算したいんですけど、
>>328 の
>固めてまとめて渡しちゃったほうがオーバーヘッドが少ないと思います。
>トータル何列あるよ、は別にパラメータで渡す。
というのはどこにどのように記述すればいいのでしょう?
>>445 もちろん、少ないならデバイス関数の引数として渡す。パラメータ複数個まとめた配列で渡しても良いし。
計算の対象、計算の結果、に加えて、計算のパラメータ、も同様にホスト側で確保→cudaMemCopyするわけ。
>>446 ありがとうございます。
物分かりが悪くて申し訳ないのですが、
cudamemcpyは確保した領域にデータをコピーする使い方しか思いつかないので、
>計算の対象、計算の結果、に加えて、計算のパラメータ、も同様にホスト側で確保→cudaMemCopyするわけ。
を簡単に例で説明していただけないでしょうか?
えっ なぜ分からないんだ? たとえばこんな感じだよ __device__ calculate(float * input, float * output, int * params){ : if (params[i] == 0) output[i] = func_A(input[i]); if (params[i] == 1) output[i] = func_B(input[i]); __syncthreads();
>>448 ありがとうございます。
なんだか変な方向に考えすぎていました。
CUDAってGPUカーネルの中で関数読んで値をreturnさせることできたっけ? あと__global__にしないとホストから関数呼べなくね?
451 :
448 :2010/01/04(月) 13:31:34
calculateが__global__で、func_A()、func_B()が__device__ですたorz
Fermi搭載GeForceの発売がまた不透明になったとか
⇒を何らかの演算として 0⇒256 256⇒512 512⇒0 といった感じにしたいのですが a = (a+256)%513; とする以外思いつきません。けど剰余は遅いので違う計算にしたいんです。 いっそのことテーブル作ったりif文にしたほうが早いのでしょうか? 馬鹿すぎてわかりません。誰か助けて
>>453 Cudaだと四則演算はほとんど処理時間には影響しないし、その式をつかうといいんじゃない?
っていおうとおもったけど、a=512のとき0にならなくね?
257⇒0 258⇒1 … でいいの? でもそうすると512⇒0がヘンだけどな。 int val; val = a + 256; if (val > 512) val = val - 513; でいいんじゃないの? というかC言語の疑問をCUDAスレで聞くのはまちがっとる、ここは人口が少ないぞ
じゃあCUDAっぽく const int TABLE[512] = { 256, ... , 512, ... , 0 } __device__ int f(int a){ return TABLE[a]; }
レスありがとうございます わけわかんないこと書いてすみません テーブルとif文試して出直してきます
>>453 b⇒aとして、
a = (b+256)%768;
でいいのかな?
0⇒256
256⇒512
511⇒767
512⇒0
釣りだよな?
申し訳ないっす
ランダム関数の作成で悩んでます。 ・CPUで作成した乱数リストをGPUに転送しない ・1スレッドの中で何度も呼ばれる ・グローバルメモリは使わない。スレッドIDやclock()をseedとして使う この制約で良い乱数生成アルゴリズムを教えて下さい。 MTGPっていうのを参考にしようとしましたがムズ過ぎて挫折…まずコンパイルが通らず(´・ω・`)
おれMTGPコンパイルできたよ。GPU側で作成してそのままGPUで使えるし。 (シンボルコピー)
使ったファイルはこれだけ mtgp32-fast.h mtgp32-cuda.cu mtgp32-fast.c mtgp32-param-fast.c make_single_random()とかの末尾を適当に書き換える。
464 :
デフォルトの名無しさん :2010/01/07(木) 12:09:10
誰かOptiXやってる人いませんかー?
気にするな、出たら買う、出るまではCUDAの修行をする。 単純でイイじゃないか。
Fermiもダメそうってどこかのブログで見た NVIDIAまじやばい
ようやくCUDAに慣れてきたところなのに、StreamSDKとかOpenCLとか DirectComputeとかまた勉強しないといけないの? 辛いのうwwプログラマは辛いのうwww orz
windows7 64bit、Visual C++ 2008 Pro環境に、CUDA toolkit、sdk 2.3をインストールして、 C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\srcにある、 _vc90.slnファイルを開いて、問題なくビルドできます。 exeファイルの出力先は、デフォルトでC:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\bin\win64\ですが、 これ以外の出力先に変更する方法を教えてください。
プロジェクトのプロパティで変更できるよ $(OutDir)\$(ProjectName).exe これを丸ごとフルパスで指定してしまいなさい。
XP,32bitでコンパイルしたプログラムを7,64bitで動かそうとしたら動かなかった・・・ こういうものなのか
473 :
デフォルトの名無しさん :2010/01/08(金) 17:23:41
32/64ビットのcudart.dllが必要
現在CUDA SDKを導入しVisual C++ 2005 Express Editionを使用しCPUでのエミュレーションを行っています。 いくつかのサンプルは動かせたのですがparticlesなど複数のサンプルでコンパイルはできているようですが実行すると以下のようなエラーが出ます device emulation mode and device execution mode cannot be mixed. エラーが出ている行は cutilCheckMsg("cudaMalloc failed"); cutilSafeCall(cudaGLRegisterBufferObject(vbo)); cutilSafeCall( cudaMalloc3DArray(&noiseArray, &channelDesc, size) ); のように「cutil〜」になってます。オプションから設定しているのでデバイスエミュレーション自体はうまく行ってるようなのですが エミュレーションを行う際はソースを書き換える必要があるのでしょうか?
メッセージのとおりエミュONOFFまぜてる またはリビルドしてないんじゃ? プロジェクト設定じゃなくてビルド構成のほうでエミュレーションにかえられないっけ?
メッセージの内容は把握できています。 リビルドも多分できてると思います。 エミュレーションの設定は プロジェクトのプロパティ→CUDA Build Rule→Emulation Mode はい にしてます。ほかの方法はよくわからないのですがほかの方法があるのでしょうか?
ビルド構成のほうからエミュレーションの設定ができました。問題なくビルド&実行できました。ありがとうございます。 ただFPSが0.1なんでほぼ無意味でした。
479 :
デフォルトの名無しさん :2010/01/10(日) 23:24:17
エミュレーションなんてHello world以上のことをやるもんじゃないな
処理する画面領域を1000分の1ぐらいに限定して、バグを調査するくらいのことはできる。
なんだっけ、エミュじゃなくて実機で実デバッグできるやつ 早く来てほしいな
CPU版アプリの移植の際に、エミュはデータ検証に使える。
483 :
デフォルトの名無しさん :2010/01/12(火) 20:21:38
-G オプションって使える?WinXPで 「'assembler' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 と出てビルドできないけど。 --deviceemuもつけないとだめなの?
484 :
デフォルトの名無しさん :2010/01/13(水) 09:38:31
CUDAのバージョンを書き出しておきたいのですが、 CUDAのバージョンを調べる関数か何かありませんか?
こっちを要求している気がする。 cudaRuntimeGetVersion() cudaDriverGetVersion()
487 :
デフォルトの名無しさん :2010/01/13(水) 09:56:08
WindowsでCUDAを使っています。 ループが一定回数超える度に、coutで経過を表示しています。 Linuxに比べて遅かったので、いろいろ試してみたところ、 DOSウインドウの前で、マウスを動かすと、速くなります。 垂直同期か何かで引っかかっているのかと思い、設定で切ってみましたが 状況が変わりません。 どなたか似たような状況になって解決された方はいないでしょうか?
488 :
487 :2010/01/13(水) 11:05:28
追加報告です。 cudaMemcpyでcudaMemcpyDeviceToHostでコピーするところで異常に時間がかかっているようです。 この1行を消すだけで、100秒ほどかかっていたのが2秒にまでなりました。 逆方向のcudaMemcpyHostToDeviceは問題ありません。
CUDAプログラムがGPUで計算等をしている間は画面表示の更新が遅くなります。 1回のループにどれくらいの時間がかかるのか、一定回数がどれくらいかによりますが、 経過の表示される間隔が短いとその影響を受ける可能性があります。 あるいは、マウスを動かすことでCPUに負荷をかけないとパワーセーブモードに入ってしまうとか・・・・。
>>488 転送に100秒かかるのは現実的にありえないので、恐らくcudaThreadSynchronize()等でカーネルの実行完了待ちを
していないのではないかと思います。カーネル呼び出しそのものは一瞬で終わりますが、
後続のcudaMemcpy(.....,...,...., cudaMemcpyDeviceToHost)時に暗黙的にそれまでに呼び出したカーネルの実行完了を待っています。
・・・・・ということかどうかは分かりませんが。
>>489 ,490さん
早速の返信ありがとうございます。
cudaMemcpyでcudaMemcpyDeviceToHostを消したプログラムで、
プログラムの一番最後にだけ結果を取り出してみたところ、
正しく計算されていました。
次に、カーネルの実行部分のみをコメントアウトした場合、
やはり非常に時間がかかってしまいました。
やはり、GPUからCPUへのデータ転送に(というよりなにか同期の部分の様な気もしますが)
時間がかかっているようです。
計算用マシンなので省電力の設定はしていません。
>>491 > cudaMemcpyでcudaMemcpyDeviceToHostを消したプログラムで、
> プログラムの一番最後にだけ結果を取り出してみたところ、
> 正しく計算されていました。
これを読むと、そもそも何度もDeviceToHostの転送をする必要がない処理という解釈で
よいのでしょうか?
DeviceToHostが遅くなる理由はハードウェア的なものから色々あります。
マザーボードを交換したという人もいました。
SDKに含まれているbandwidthTestの結果はどうなっていますか?
"--memory=pinned" を付けた場合と付けなかった場合をそれぞれ調べてみてください。
493 :
デフォルトの名無しさん :2010/01/13(水) 11:59:12
Device 0: GeForce GTX 285 Quick Mode Host to Device Bandwidth, 1 Device(s), Paged memory Transfer Size (Bytes) Bandwidth(MB/s) 33554432 4340.2 Device to Host Bandwidth, 1 Device(s), Paged memory Transfer Size (Bytes) Bandwidth(MB/s) 33554432 4193.7 Device to Device Bandwidth, 1 Device(s) Transfer Size (Bytes) Bandwidth(MB/s) 33554432 119962.3 --memory=pinned Device 0: GeForce GTX 285 Quick Mode Host to Device Bandwidth, 1 Device(s), Pinned memory, Write-Combined Memory Enabled Transfer Size (Bytes) Bandwidth(MB/s) 33554432 5758.1 Device to Host Bandwidth, 1 Device(s), Pinned memory, Write-Combined Memory Enabled Transfer Size (Bytes) Bandwidth(MB/s) 33554432 5471.9 Device to Device Bandwidth, 1 Device(s) Transfer Size (Bytes) Bandwidth(MB/s) 33554432 119852.3
結果はこんな感じです。 特に片方だけ遅いというわけでもないようです。 Linuxで起動した場合、遅くなるという問題は起きませんでした。 DeviceToHostが必要なのは結果を取り出すときだけで、 計算自体には必要ありません。
495 :
デフォルトの名無しさん :2010/01/13(水) 12:03:47
・CUDA内での計算処理、ループ数とループ内のステップ数、スレッド数ブロック数、だいたいどんなもんすか ・HostToDevice、DeviceToHostで転送するメモリのサイズはどのくらいですか
とりあえず タイマー1,2作成 cudaMemCopy(HostToDevice) タイマー1,2起動 <<<>>>カーネル呼ぶ cudaThreadSyncronize() タイマー1停止 cudaMemCopy(DeviceToHost) タイマー2停止 してほんとにMemCopyなのかカーネルなのか確かめてみる必要は。
コピーが細切れでforループでやたら回数呼んで転送してたりしない? 1発で全部転送するのと1/1000ずつ1000回コピーするのとでは、 かかる時間に雲泥の差があるけど。
499 :
487 :2010/01/14(木) 04:10:12
PCを再起動したら、上記の問題は出なくなりました。 お騒がせしました。
おいww 終わりかよww
501 :
デフォルトの名無しさん :2010/01/14(木) 11:44:30
cutil64.dllってどこに置けばいいの?
502 :
デフォルトの名無しさん :2010/01/15(金) 05:05:43
GPU側で配列の合計を求める方法を教えてください
サンプルのreduction見れ
504 :
デフォルトの名無しさん :2010/01/15(金) 09:52:56
syncthreadsって異なるブロック間のスレッドも同期されるのでありましょうか?
>>504 programing guide よめ
506 :
デフォルトの名無しさん :2010/01/15(金) 23:10:51
Best Practices Guide もいいこと盛りだくさん書いてあるよ
cudaでは多次元配列の使用は推奨されてないの?
pthreadとの組み合わせでうまく動作せずに困っています。 引数として渡す構造体に、float * device_Xを用意して for(int k=0;k<NUM_THREADS;k++){ cudaMalloc((void**)&targ[k].device_X, sizeof(float)*(hostX.nRow)*(hostX.nCol)); cudaMemcpy((void*)targ[k].device_X, host_X, sizeof(float)*(hostX.nRow)*(hostX.nCol), cudaMemcpyHostToDevice); pthread_create(&handle[k], NULL, compute_thread_func, (void *)&targ[k]); } と渡すと、pthread内で cudaMemcpy(temp,argument->device_X, //argumentは渡されたvoid* argをキャストしたもの sizeof(float)*(nRow)*(nCol), cudaMemcpyDeviceToHost); としてもうまく取り出せません。(中身がぐちゃぐちゃになる) 同様の処理をpthreadで呼び出す関数内で行うとうまく動作します。 スレッドごとにメモリを取るのだから、中でやってもいいのですが気になります。 何か原因になっていそうなことは無いでしょうか。
>>508 #1個のGPUに複数のスレッドからアクセスしたいアプリケーションなのかよく分かりませんが・・・・。
CUDAはスレッド毎にGPUのリソース(コンテキスト)を管理しています。
従ってこの例では
子スレッドのcompute_thread_func内の処理は
親スレッドがcudaMallocした領域にアクセスできません。
>>509 ありがとうございます。
複数のスレッドから一台のGPUへのアクセスです。
(後々、スレッドごとに一個のGPUにしたいのですが)
スレッドごとに管理しているのははじめて知りました。
解決しました。
「Picture Motion Browser VAIO Edition」を追加。 超解像HDアップコンバートやノイズ除去、手ぶれ補正などの編集や動画作成を、NVIDIA CUDAによるGPU演算を使って行なえる。
GT200 Fermi トランジスタ数 14億 30億 倍精度浮動小数点 30FMA Ops/clock 256FMA Ops/clock 単精度浮動小数点 240 512 シェアドメモリ(SM) 16KB 64KB L1メモリ 無し 48KB or 16KB L2メモリ 無し 768KB アドレス幅 32bit 64bit 複数のカーネル実行 無し 16個まで(GigaThredエンジン) *L1キャッシュ搭載 GT200では16KBのSMが32個あり、それぞれCUDAコアを8個割り当てられ、L1キャッシュが無し。 Fermiでは64KBのSMが16個。それぞれにCUDAコアが32個割り当てられ、SMから16KBか48KBのどちらかをL1キャッシュとして使用可能。 GT200に対して、3倍のSMと16KBのL1が使用可もしくは同じサイズのSMと48KBのL1が使用できるようになった。これにより、今までCUDA化できなかったプログラムの対応を増やし、さらに高速化もできる。 各CUDAコアに含まれるFPユニットは倍精度浮動少数演算を強化し、GT200に対し8倍の能力。 *L2メモリの搭載 グローバルメモリに対する高速化。 *C++をサポート *複数のカーネルの動作をサポート SM内部のパイプラインを強化。SFUが複数に分けられたのでタスクとデータをより効率化。スレッドスケジューラを2個。 *双方向PCIE通信 GT200ではPCIEバスの送受信をどちらか片方しか一度に実行できず、理論値8GB/s・実測4〜5GB/s程度だが Fermiでは双方向通信が可能になり12GB/sを実現 *新しいメモリコントローラ FermiよりGDDR5まで対応し、ECCにも対応する。 *コア内部を各部でモジュール化 設定された価格帯や用途ごとにコアを設計しなおさず、機能をカットオフしたり追加したりできる。 SM単位でCUDAのコアを減らしたり、D3DやOpenGLなどの固定ハードウェアが不要なTeslaなどでオフになったりする可能性もある。
GT200 理想のFermi 現実のFermi トランジスタ数 14億 30億 30億 倍精度浮動小数点 30FMA Ops/clock 256FMA Ops/clock 224FMA Ops/clock 単精度浮動小数点 240 512 448FMA Ops/clock シェアドメモリ(SM) 16KB 64KB 〃 L1メモリ 無し 48KB or 16KB 〃 L2メモリ 無し 768KB 〃 アドレス幅 32bit 64bit 〃 複数のカーネル実行 無し 16個まで(GigaThredエンジン) 14個まで(GigaThredエンジン)
OpenCL待ちしてたけど、GPUの対応はCUDAだけっていう開発ばっかな Fermiで本気出すから
GT100ってなんかメモリアクセスのレイテンシがすごくでかくない? それを隠蔽するために、L2キャッシュが128Kになっているけど、 コヒーレンシとかどうなのかな? やっぱりGPUはデータ並列なアプリしか向いていないのかね。
Fermiのグローバルメモリのレイテンシが遅いってのは何処から来た情報?GDDR5に対応するんだから、帯域は大きくなりそうだけど。
>>512 SFUは今のGT200でも複数ある。
ただ、SFUが外部のパイプラインに分かれたからSFUを使っているときに違う種類の演算ができるようになったってことじゃね・。
>>515 最適化しなければいけない
>>518 >いずれにしても、何でGPUがあんなにレイテンシが大きいのかがわかったよ。
俺のために説明してくれ!
GPUのメモリのレイテンシが大きいというよりも、CPUの場合と同じぐらいはかかるといった方がいい
CPUだとメモリチャンネルが精々2〜3チャネル位しか無いが、GT100だと12チャネルもあるから、DRAMのチャネルのスイッチングに それ以上かかると思っていい。あと、仮にGPC1?がDRAM0チャネル上にあるデータと、 DRAM11チャネル上にあるデータを同時にアクセスする場合、当然レイテンシがかかる。 もし、GPC1がDRAM0、DRAM1だけのデータアクセスですむなら、CPUと変わらない。 最適化が必要というのはそういったところだと思う。
MTGPがコンパイルできません。
>>463 の言う、4つのファイル使って試したところ100個近くコンパイルエラーが出てしまいます。
あと「末尾を適当に書き換える。」の意味がよく分からんどす…
エラー内容は
1>\略)\mtgp32-fast.h(117) : error C2054: 'inline' の後に '(' が必要です。
1>\略)\mtgp32-fast.h(120) : error C2057: 定数式が必要です。
1>\略)\mtgp32-fast.h(120) : error C2466: サイズが 0 の配列を割り当てまたは宣言しようとしました。
1>\略)\mtgp32-fast.h(120) : error C2085: 'mtgp32_do_recursion' : 仮パラメータ リスト内にありません。
1>\略)\mtgp32-fast.h(121) : error C2061: 構文エラー : 識別子 'inline'
1>\略)\mtgp32-fast.h(122) : error C2054: 'inline' の後に '(' が必要です。
...
WinXP32bit、VC++2005、CUDA SDK2.3
該当箇所のコード見てもどこが悪いのか分からない…助けて…。
単にパイプラインステージが何百もあるからレイテンシがでかいのだと思ってました
>>522 あ。おれか。
元のソースと自分のソースでdiffしてみた。
・inline を全部削除してみて。
・末尾を適当に書き換える。は、元だとプリントして捨ててしまっているので、
利用したいように書き換えてねと。
おれはmake_uint32_random(d_status, num_data, hostbuff); として
hostbuffを自分で使えるようにしました。
>>523 正解
メモリチャンネル云々は殆ど関係ない
CPUはメモリとのクロック差のため
GPUは長大なパイプラインのためレイテンシがデカイ
別にパイプラインが深いわけではなくてバッファが大きいだけなんだけど。
200-400段は十分に・・
>>524 レスサンクス。
inlineを削除したら見事にエラーが亡くなりました(`・ω・´)
これから自分のソースに組み込もうか…と状況に入れます。
重ねて質問申し訳無いですが、hostbuffの名前からしてMTGPの乱数は一度バッファにぶち込んでから使うという事になるのですか?
>>461 ようにカーネルの中で特に意識せず使いたいのだけれども…
MTGPがglobalメモリやテクスチャを使ってるのなら、Cのrand()のように連続で呼び出して使えたら良いなと思ってるんですが無理ですかね?
>>528 おれはホスト側で使いたいので、make_uint32_randomの末尾でホスト側のバッファにコピーして使ってる。
デバイス側で使いたいなら、make_xxxxx_randomにd_buffをmain()側でとって渡し、
make_xxxx_random()内ではfreeせずにそのまま。すると次にmain()内でデバイス側関数を呼び出すときに
そのまま渡して使える。 ※スレッドが変わってはいかんので注意
530 :
デフォルトの名無しさん :2010/01/23(土) 05:30:39
CUDAを使って大量のデータのごく簡単な統計値(最小、最大、平均、標準偏差)を計算したいんですが、何かいいサンプルとかありますか?
CUBLASにあるんじゃ。
>>530 そういう、「最後が一個」な演算は、reductionで探すと有る気がする
並列性を有用に使うのがなかなか面倒らしい
OpenGL glutで時系列で変化する数値計算の結果を表示しようとしています。
GPU 2個で計算する場合、コールバック関数内でスレッドを生成することになると思うのですが、
この度(毎フレーム)にホストからグローバルメモリへデータ(時間による変化なし)を
コピーしなくてはいけません。
glutMainLoop(); 呼び出し前に両GPUにコピーした場合は、
コールバック関数内で生成したスレッドにグローバルメモリのポインタを渡しても参照できません。
データのコピーを一度だけですます方法はないでしょうか?ご教示ください。
スレッド生成は
ttp://tech.ckme.co.jp/cuda_multi.shtml を参考にしました。
>530 それぐらいだったらたぶんCPUで実行した方が速いよ
>>533 GPU0用、GPU1用のスレッドをglutMainLoop()呼び出し前に生成するべきかと。
thread数 = N Mat[N]; id = threadIdx.x; if(id%2==0){ 演算A Mat[id]にコピー }else if(id%2!=0){ 演算B Mat[id]にコピー } のようなプログラムを組んでいるのですが、結果をみると最後の2つの要素と同じ計算結果が全体に入ってしまいます。 N=16なら 14の結果が0,2,4…12に 15の結果が1,3,5…13に入ってしまいます。 どこに問題があるのでしょうか
538 :
デフォルトの名無しさん :2010/01/26(火) 00:02:22
>>530 俺もこれ知りたい。
N社のSDKを見ても、画像処理のサンプルとかたくさんあっても、単純な総和計算とかないもんだね。やはり向いてないからか・。。。
ご丁寧にCのほうが早いとか教えてくださる人もいるがw
マルチパスの画像フィルターとか、
デバイスの中にある中間結果を作って、
その統計値を、次のパスの計算で使ったりするのが常套手段だから
ここでいったんホストのほうにコピーするとボトルネックになってしまう。
デバイスの中のデータの統計値を出すライブラリとか作ってくれると本にありがたいんだが
>>530 , 538
SDKのreductionサンプルが参考になると思う。 確かpdfのわかりやすいスライドが一緒に入っているはず。
CUDAのアーキテクチャって、総和とかのreduction系演算は
不向きとまでは言わないまでもちょっと頭をひねらなきゃいけない分野だよね。
540 :
536 :2010/01/26(火) 01:19:31
演算途中で計算領域が被ってただけでした。失礼しました。
>>539 そうだね。
沢山のデータがあるなら、最終はCPUにやらせても良さそうだけど、
転送がボトルネックになるなあ。
それだったらGPU内でやらした方が速いか。
あとI/O系があるとだめだよね。
ダブルバッファやトリプルバッファが使えるようなアプリならいいんだけど。
そうなると画像、映像系ばかりになってしまうなあ。
542 :
デフォルトの名無しさん :2010/01/26(火) 09:14:50
処理に割り当てるmultiprocessorの数を指定とか出来ませんか? 出来ればgridサイズ変えずに そもそもOSもGPU使う場合割り当てがどうなってるのか分からないんですが
>>542 CUDAプログラムが実行中はOSはGPUを使えないので全てのSMを使用しても問題ありません。
5秒以上使ったらエラーが出たよ。
SMを1個しか使用していなくても5秒以上1つのCUDAカーネルが実行されるとタイムアウト。
546 :
542 :2010/01/26(火) 11:15:31
へー、なるほど。 あとgridサイズ小さくする以外に使うSM数を制限できますか?
できませんし、その必要もないでしょう。
548 :
542 :2010/01/26(火) 11:48:03
>>547 そうですか、ありがとうございます
並列計算の研究の一環でCUDA使ってるんで
並列数の変化でデータが取れたら嬉しいな、という理由です
>>548 素直に描画用とは別にGPUを用意しましょう。
総和を取る処理は私も書いているけど、仮想的に二次元にデータを配置して、縦に集計するところまでをGPUでやっている。
残りはCPU側に吐き出してからCPUではSSEを使って集計。
>>548 1番最初に実行が始まるCTAの配置は予測可能なので、
その中で使わないSMに割り当てられたCTAはコア内でダミーの演算を長時間繰り返すことでそのSMを占有し続ける。
こうすれば本来の計算は残りのSMでのみ行われるようになる。
通常時間計測できるのは全CTAが完了するまでの時間なので以下のどちらかを。
1)最後のCTAがdevice memoryにマップされたhost pinned memoryに何か書き込む。
2)ダミー演算の繰り返し回数を段々少なくしていき、計測される時間の減少率が変わるところを探す。
なお、全SMを使わないとメモリアクセス効率も落ちるのであまり面白くない。
> 仮想的に二次元にデータを配置して、縦に集計するところまで なるほど。ふつくしい。n次元でCPUでは最後の一次元だけやらせれば、対称になるな
552 :
542 :2010/01/26(火) 21:31:38
>>549 別に用意してこの場合メリットってありますか?
あと総和ならReductionで組んだけど今回はGPU単体の話だったんで最後までGPUでやりました
デバイスホスト間の転送時間って馬鹿にならないイメージあるんですが、CPUにやらせたほうが速いんですかね?
まあ最後のちょっとだから誤差の範囲な気がしないでもないw
>>550 結構シビアですね、
直接的な方法が無ければgridサイズ縮めてIdx周り弄ろうと思います
↑の方法で弊害無いですよね?;
553 :
528 :2010/01/27(水) 17:26:29
少し前にMTGPについて質問した者ですが、どうやら自分の要求とズレた感じでした。 thread 256、block 1でmake_uint32_random()するとバッファに768個のデータが生成されるが、でっていう…。 これはメルセンヌツイスタの高周期な乱数列の1部分って事で、本当にあの高周期な乱数を使いたいならその分のメモリが必要だということなのかな。 独自の乱数ジェネレータを作って、その768個の中から1つを取り出して…みたいな事をやり始めるとまた性質が変わってしまうし、本末転倒に。 結局、カーネルの中でシミュレーション目的の使用方法としては微妙だったので絶望。。。 スレッドID毎に使える線形合同法(遷移型)の乱数として使えるようになんとかできないものか…
え、おれ100万個単位で作って使えてるよ。 int num_data, にちゃんとでかい数与えてるかな
>>554 いや、num_dataの数を変えて生成される個数の事はあまり重要じゃないのよ…
問題はカーネルの中で使おうとした時、バッファに作成された乱数が並んでいる形態では微妙なのです。
例えば、100万個作ったとして256のスレ数で使うなら使用部分を分割する事になりますよね(thID==0は、バッファのindex0〜約4000、という感じ)
いや、各スレッドは100万個のうち初めのindexだけseedとして決めて、あとは順次indexを増やして使っていく感じでもいいけど、
両者とも乱数列の周期はバッファのサイズに依存してしまいます。
一方、よくある{x=x*1103515245+12345; return x&2147483647;}このような方法は、アルゴリズムが優秀だとxが4byteなら最大で2^32の周期を持ちますよね。
今の状態のメルセンヌツイスタで2^32の周期を得ようとしたら、どんだけ大きいバッファが必要かっていう…
精度の良い乱数という点では利点ありますが、globalメモリを物凄く使う割にはなんだかなぁ…という複雑な気持ち。
MTGPの形態を知らなかった自分が悪いんだけど、要はこれ乱数生成を並列化して高速にしたもので、
実際にパラレルな計算で使う用にはなりえない事が分かりました。
自分の要求としては、GPU Gems3の「CUDAによる効率的な乱数の生成と応用」がチラッと見た感じでは合致してたので、今からこっちを参考にしてみます。
長文スマソ。
>>554 にはとても感謝している。こんな結末で申し訳ない。
>乱数列の周期はバッファのサイズに依存してしまいます 横から失礼しますが、 for( ; ; ) { make_uint32_random(, , d_buff); //デバイスメモリに作らせて残す my_kernel_func<<<>>>(d_buff, , , , ); //MTGPで作った乱数を消費 } こんな感じとして、256スレッドが一回に8192個の乱数を使う →make_uint32_randomは2097152個の乱数を生成する で良いのでは? make_uint32_random() は複数回呼び出すごとに 前回のmtgp32_params_fast_tの続きから処理するわけで、周期は 2^11213-1 でしょう。÷256しても2^11205とかだ
stupid questionですみませんが、VC++ 9.0で 1. .cppと.hのように、.cuファイル内でインクルードしているファイルが更新されたら.cuを再コンパイル対象にしたい。 2. ptxを出力したい。nvcc -ptxでは無理でした。 以上について教えてください。お願いします。
>>557 コマンドラインから nvcc -ptx *.cu とやっても駄目?
-keepでいいんじゃね 1.についてはSource Dependenciesを個別に設定すれば一応できる
>>558 XP Pro 32bitとVista Ultimate 64bitの両環境で、
コマンドラインからnvcc と打つとcl.exeがないと怒られます。
プロジェクトのプロパティを参考にパスとincludeを指定してやっても
エラーは控えていませんがコンパイルできません。
VC使ってる人はどうしてるんでしょう?
-ccbin で指定しても駄目ですか?
もちろんVSコマンドプロンプトから打ってるよな
>>562 ふつうのコマンドプロンプトを使っていました。
どうもお騒がせしました。
普通にC++のコードを書けるようになってからじゃないと、学習効率が悪くてどうしようもないぞ。
>>559 俺は556じゃないが-keep知らなかった。ありがとう。
まあ俺は学生だから規定課題でるけどな しかしCellとかに比べてあんまり最適化するとこないな
どのくらい参加するんだろう? 俺もとりあえずエントリーしようかな。
自由課題の方で、パターン形成する発展方程式とかの数値計算すると、絵的にも面白そうなの出来そうじゃない?
570 :
デフォルトの名無しさん :2010/02/10(水) 10:54:42
jpegをデコードするライブラリもしくはCUDAのコードはどこかにありませんか?
GPU Challengeの課題が増えた メルセンヌツイスタと言われるとHack the Cellを思い出すな
572 :
デフォルトの名無しさん :2010/02/10(水) 12:30:21
SLI環境で、プログラムを2つ実行した場合、それぞれ別のGPUを 利用する方法を教えてくれ
> SLI環境で えっ、ひとつにしか見えないんじゃないの?? 出来るの?
>>572 cudaSetDevice()でそれぞれ0と1を指定する。
>>573 東工大青木先生はGeForce4つ並べてた
OpenMPで並列化していたと思う
CUDA版と言えるOpenMPはない OpenMPのスレッド指定とCUDAのdevice指定を組み合わせただけのこと
そういうことか、今度挑戦してみようかな
> GeForce4つ並べ と > SLI は違うんじゃね? ケーブルで繋ぐのがSLI・・・かな
580 :
デフォルトの名無しさん :2010/02/12(金) 10:07:29
OpenMPを使えば複数のGPUを簡単に使えるのですか? やりかたをおしえてくれろ
581 :
デフォルトの名無しさん :2010/02/12(金) 11:11:35
CUDAで顧客向けプログラムを作成しています。 CUDAプログラムの配布先には本体以外に何を配布すればよろしいのでしょうか?
TeslaかQuadroを配っておけば良いと思うよ
cutil使わなければcudart.dllだけでよろしよ
>>579 内部でケーブルでつながってても、
デバイスメモリが共有されるわけじゃないから
CUDA的には関係ない。
586 :
デフォルトの名無しさん :2010/02/13(土) 04:48:44
CUDA FORTRANのセミナーが青木先生のとこで開催されるらしいが、おまいら行く?
デバイスエミュレーション時の速度って、実際のCPUとの目安で考えたら
どのくらいスケールして考えればいいですか?
初めてエミュレーションモードを使ってみたんですが、3000倍以上の差が付いて明らかにおかしいと思うんです…
CPU: Core i7
[email protected] 、 GPU:Tesla C1060
Q720って720QMのこと? ノートPCにTeslaが搭載されているとか、聞いたことがないんだけど
591 :
589 :2010/02/15(月) 17:56:06
追記。 grid(2,1,1)、block(256,1,1)でのカーネルで、3000倍になります。 これからgridを増やすと、さらに差が広がっていきます。 カーネルで実装した内容を、CPU版で実装したくないけど速度比較はしたい。 ・・・無理でつか?
592 :
589 :2010/02/15(月) 18:06:39
>>590 Teslaは別のデスクトップPCので、エミュを動かしたのはノートPCでの方です。
紛らわしくて申し訳ない。
どちらもPCもCUDA使えるんですが、CPU自体はノートの方が性能良かったのでこちらを使いました。
ノートPCのGPU: GeForce GTX 260M
そもそも、エミューレーションモードって非CUDA環境でも CUDAカーネルのデバッグが出来るようにしたものでしょ あくまでテスト用のもの
誤)エミューレーションモード 訂)エミュレーションモード
595 :
デフォルトの名無しさん :2010/02/15(月) 19:10:55
3000倍?そんなもんでしょ
効率の良いブロック分けの仕方?がわからず困っています. 実行時にN個のデータ系列が与えられて, それぞれの系列へ施す処理内容自体は同一なのですが, その処理に用いるパラメタ値が異なります. 例えばN=3の場合,パラメタもp[0]〜p[2]の3個があって, データ系列0の全データ { D[0,0], D[0,1], D[0,2], ..., D[0,m0] } にはp[0]を加算, データ系列1の全データ { D[1,0], .... , D[1,m1] } にはp[1]を加算, データ系列2の全データ { D[2,0], .... , D[2,m2] } にはp[2]を加算 という具合です. 全系列のデータ数が同じ(m0=m1=m2)ならば グリッドの次元の1方向を系列(0〜N-1)に割り当てれば良いかと思うのですが, 系列毎にデータ個数がかなり異なる場合はどうすればいいのでしょうか? データ個数は系列ごとに少なくとも数千個くらいになります. 同じような割り振り方だと何もしないブロックが大量にできてしまいそうです.
597 :
デフォルトの名無しさん :2010/02/15(月) 20:36:27
CにD[0,0]というものはないのでよくわからないけど、 いったん長い配列にまとめて処理して、あとでCPUでばらせばいいのでは。 D[i,j]のjについて、自分はどのpに属するのか覚えさせて。
追記 Nexus使うとネットワーク経由で、 コード書く用のPCとデバッグするPCを分けられるよ、ってことね。
>>598 うーん、デバッグというよりは単にCPUとGPUで速度比較をしたいだけなんです。
うまく並列化して普通は、1〜50倍くらいの成果になると思うんですが・・・
目安でいいからエミュレーションモードから大体の速度が分からないのかなと。
601 :
デフォルトの名無しさん :2010/02/16(火) 23:24:57
いまいち意味がわかんないけどCPUコードとGPUコードをデバイスエミュで実行したらCPUコードのが3000倍早いって事? それだったらそんなもんかと。デバイスエミュは重いし。 違うんだったらごめん。 CPUとGPUで速度比較したいなら普通にCPUとGPUそれぞれ向けのコード書いて実行したらいいんじゃない??
>>601 あ、あれ? 自分のデバイスエミュの認識自体が間違ってたかな…?
言いたかったのは、実行するハードの方での両者の比較です。
CPUコードと言うのはありません。
カーネルや、その内部で呼ぶ__device__の関数らがGPUコードだよね?それを普通に「GPU」が実行した時の速度と、
デバイスエミュを使ってCPUが実行した場合(内部では逐次計算?)の速度では、普通に「GPU」で実行した方が3000倍速いということです。
>>591 の通り、GPUコードが多くなりすぎて、同じ事をするCPUコードを実装するのが面倒なのです。
デバイスエミュはCPUが実行するとの事で淡い期待を抱いてましたが無理そうな感じなんですな…
>>602 比較する目的はなんでしょうか?
研究目的であれば面倒であろうがCPU用も実装しなければなりません。
そうでないなら比較なぞしなくてよいのではないかと。
ちなみにGPU:エミュが3000:1程度であればCPU用に普通に実装した方がGPUより速い可能性が十分にあります。
面倒でも計算結果の比較しろよw nvidiaのサンプルコードでも結果の比較してるだろ
>>602 emulation modeは,名前の通りGPUでの動作を模擬しているだけで,
その計算速度とGPUの計算速度を比較することに意味はない.
emulation modeがある理由は,カーネル内にprintfとかのコードを書いて
debugしたり出来るようにするため.
従って,CPUとGPUの計算速度の比較を行いたいなら,それぞれに最適化した
2つのコードを書いて比較する必要がある.
関係ないけど,
CPUとの比較しているときにCPUのコア一つとの比較が多い気がするけど,
それフェアな比較じゃないよね.せめてOpenMPくらい使おうよと.
まぁ使うとGPUの存在感が薄れるのだけれども….
>>603 研究なんて言えないようなものです。目的としては自己満足になりますね。
ただ、目安程度であれど比較できないとGPUとCUDAを使う意義に関わってきます。
早ければSUGEEEE!!ってなって満足し、遅ければそこできっぱり止めるという選択ができる。
そして3000:1ならまだCPUの方が早そうだというのは参考になりました。
>>605 おっしゃる通りですが、厳密に比較するまでは求めていないんです。
今自分がやってることは無意味なのか?(つまりCPUの方が普通に早い)が分かればいいんです。
grid(2,1,1)でフェアじゃないのは、コーディングが糞なので2以上じゃないとGPUで動作しないんです('A`)・・・(メモリ周りの関係で)
我侭な要求でスマン。
逆に考えるんだ CPU側で動作をきっちり検証したプログラムを、 GPUに移植して、速度を比べる。 GPUに本当に適した問題なら、数十倍出る場合もあるし。
>>605 GPUの優位性をうたうような文脈で
比較対象のCPUコードが1スレッドだったら
それを評価する人間は目が余程の節穴でない限り、
CPUのコア数倍した結果と比べるでしょ。
物凄く差がある場合はそれでも十分優位性をうたえるから。
609 :
デフォルトの名無しさん :2010/02/17(水) 21:05:25
>>605 1コアの40倍とあれば4コアの10倍と読み替えればいい訳で。
4コアと比較したらどうなるかということではなく、 1コアと比較してる人がCPU版もまともにチューニングしてるとは思えない、ということかと。 まぁ、皆GPU版ばっかりチューニングしてますから。
たぶんCPU版はSSEすら使っていないんだろうね。 メモリ帯域がものを言うコードでなくて、CPUがNehalemだったら、 安いGPUなんかじゃ全く優位ないからね。
誤爆った/(^o^)\
うちは理論で「***手法より*%高速化して最速!」とかやってないってのもあるけど GPUで組んだ手法と既存の手法を比べる場合、既存のほうはベーシックにしろと指導された。 複数CPUだとかSSEを使ってガチガチに最適化した手法と比べちゃうと基準が分からなくなるからだと。 他の高速化との差を知りたければその論文と比較しろということだと思う。 CPU最適化して無いなんて糞というのも分かるけど、こういうところもあるということで。
コードの比較もいろいろだよな。 同じアルゴリズムを採用しても、CPUでも書き手によってGPUでも明らかに差が出てくる。 でもGPUを使う場合、多くの場合はCPUよりも速くなりました。というのが目的な訳で、 CPUの方が速いならあえてGPUを使う必要はないからね。 基準が曖昧になるのもわかるけど、そもそも基準が曖昧な気がするなあ。 場合によってはかなり恣意的になることもあるし・・・・。
Femiやばいまた延期確定かも
一般人が入手できるのは1年後になる可能性もあるらしいね
なんでそんな度々延期になるの
>>618 ペーパーロンチで実際開発が
行われていないからだよ
今回のケースは大きな欠陥があることを知りながら、小手先の改良でなんとかしようとして 「完成品」を大量生産をして、まとにチップが取れなかったのが原因だろ 1%程度とされる歩留まり率で、1チップ当たり5000ドルの原価 これでは商売にならないね
3/19に東工大青木先生がCUDA Fortranのセミナやるんだって
関係者の宣伝おつ
青木先生に集客されたくねえなあ正直
nexusをリモートで動かそうとしたが、ブレークポイントでとまらねぇ・・・。 色々試したがどうにも解決しないので教えてください。 状況としては、nexusのユーザーズガイドに沿って設定。 ためしにnexusサンプル動かそうとしたら、 ランタイムAPIプロジェクトはGetDeviceで引数に0が。 で、次の行で落ちる。 DriveAPIは落ちない。んでホスト側の画面右下に青いポップアップ出て、 ターゲットマシンにコンソール画面出てるのでプログラムは正常に動いてるっぽい。 でもカーネル関数内にブレークポイント置いても止まらず。 自分でSDKサンプルのプロジェクトの設定変えて試しても同じ。 マシン環境はこんな感じ。 ホストマシン Vista 64bit SP2 .Net3.5 SP1 Host nexus1.0(jan 64bit) GPU FX570 VC++ 2008 SP1 DirectX10 August 09 CUDA SDK2.3 32bit CUDA ToolKit2.3 32bit
625 :
続き :2010/02/23(火) 22:08:57
ターゲットマシン Vista 64bit SP2 .Net3.5 SP1 Target nexus1.0(jan 64bit) GTX285 VC++ 2008 DirectX 10 August 09 CUDA SDK2.3 32bit 他に設定としてはEnable Security Serverをfalse nexus→option→Enable secure connectionをfalseにしてます。 使い方は、ホストマシンでVC起動→プロジェクト読み込み→nexusデバッグ ターゲットマシンはデバッグモニタ起動のみ。 どこがおかしいのだろう?
Fermi終了したらこのスレも終了するんかなあ
the launch date for GeForce GTX 480 and GTX 470 is March 26
>>627 ペーパーリリースで全世界で1万枚以下の出荷といううわさだけどね
一般人が手に入れられるようになるのは、下手をすると来年
良くて年末という予想がある
やっぱ、シリコン丸ごと改良しないとだめなんか。 半分ダメで256コアでもいいんだけどww
俺はNexusインストールすらできなかった
消費電力280Wだっけ。。。GTX480
アム虫キモ
633 :
625 :2010/02/26(金) 23:13:31
もうよくわからんからnexusのエミュモードでやることにした。
カーネル関数内でブレークするし、値もちゃんと表示されてそう。
>>630 OS対応してないとか?Vistaか7しかできない。
あとはOSとnexusのbitが違うとか。
>>633 インストーラがVS2008 SP1入れてあるのに読み取ってくれなくて、
インストールができない状態だった。
Microsoftからダウンロードしたばっかりのイメージを使ってインストールしたから
当然SP1はあたっているものかと思っていたらあたっていなかった、っていう初歩的なミスだった。
ちょっくら遊んでくる
,. -‐'''''""¨¨¨ヽ (.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ! |i i| }! }} //| |l、{ j} /,,ィ//| 『おれはNvidiaにARE YOU READY?と言われて i|:!ヾ、_ノ/ u {:}//ヘ 準備していたら準備しているのはNvidiaの方だった』 |リ u' } ,ノ _,!V,ハ | /´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが /' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった ,゙ / )ヽ iLレ u' | | ヾlトハ〉 |/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった… // 二二二7'T'' /u' __ /:::::::/`ヽ /'´r -―一ァ‐゙T´ '"´ /::::/-‐ \ 128bitメモリバスだとかリネームテクノロジーだとか / // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんなチャチなもんじゃあ 断じてねえ ノ ' / ノ:::::`ー-、___/:::::// ヽ } _/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしいものの片鱗を味わったぜ…
GTX480がそこそこ出回るらしい(core数は当初想定よりも少なくなる可能性があるが) Fermiアーキテクチャを思っていたよりも早い時期に体験出来る可能性が出てきた
Fermi火事出すだろうな 電気食いすぎだ
GF100(GTX480, 470)は高電力でお値段も高めになるだろうから、 Fermiアーキテクチャをとにかく早く試したい人以外はその次のGF104がいいと思う
半分だけの460とか出ないかな?
売り物にならない奴はQuadro逝きか。 OpenGL市場ってほんと舐められてるな。 ゲイツに縛られない自由なAPIだったはずなのに。
CUDA上の命令がどれくらいのクロックで動くかまとめられていませんか? 整数の乗算やら三角関数はプログラミングガイドに載っていたのですが,ほかの命令も知りたいです
「どのくらい」でいいなら実測すればいいかと
エミュレーションモードでやるとうごくのですが、GPUをつかうと動きません。 const int c = border + (blockDim.x * blockIdx.x + threadIdx.x) * step * 2; const int r = border + (blockDim.y * blockIdx.y + threadIdx.y) * step * 2; const int i = 1; // atomicAdd(&count[0], 1);//ここでは動くのでatomicAddの問題ではない if(c >= i_width - border || r >= i_height - border) return; int i_max = -1, r_max = -1, c_max = -1; float max_val = 0; for (int ii = i; ii < min(i+2, intervals-1); ii += 1) for (int rr = r; rr < min(r+2*step, i_height - border); rr += step) for (int cc = c; cc < min(c+2*step, i_width - border); cc += step) { float val = getVal(d_m_det, o, ii, cc, rr, i_width, i_height); if (val > max_val) { max_val = val, i_max = ii, r_max = rr, c_max = cc; } } // Check the block extremum is an extremum across boundaries. /***********ここでd_iptsにiptを加えてもうごく*********/ // float4 ipt ; // d_ipts[atomicAdd(&counter, 1)] = ipt; if (max_val > 0.0004f && i_max != -1 && isExtremum(d_m_det,o, i_max, c_max, r_max, i_width, i_height, intervals)) { float4 ipt = interpolateExtremum(d_m_det, o, i_max, r_max, c_max, i_width, i_height); if(ipt.x >= 1) { d_ipts[atomicAdd(&counter, 1)] = ipt;//ここの行をコメントアウトすると動く ipt.x += 1; }} 最後のif文の中でd_iptsやcountにアクセスするのがだめっぽいのですが・・・ なにかif文を書いたときに同じような症状になった方や、これを見ただけでわかる方いらっしゃったら、教えてください。 よろしくおねがいします。
とりあえず問題になってるatomicAdd(&counter, 1)の戻り値調べようか
counterの宣言にちゃんと__device__は付いているのだろうか・・・
649 :
646 :2010/03/17(水) 00:40:32
>>647 エミュレーションで確認したところ戻り値はcounterと同じ値になっていました。
実際にGPUでうごかすと、
counterをデバイスからホストへ送るところでunspecific launchとなるか、
永久ループに入るか何かで画面が固まり、ブルースクリーンになって落ちます。
>>648 _device_をつけてグローバル変数(っていうのかわからないけど)として定義しています。
その反応だとアクセス違反のときが多いのだがそんなことないよな?
651 :
デフォルトの名無しさん :2010/03/17(水) 13:42:58
CUDAでつかうlong doubleってWindowsとLinuxでサイズは違うの?
652 :
デフォルトの名無しさん :2010/03/18(木) 00:14:29
>>650 アクセス違反ってcounterの位置がおかしいってことですか?
このプログラムをいれずに単にcounterをデバイスからホストに送ることは可能でした(初期値として0をおくっていたので0が帰ってきていました)。
つまり、このプログラムのようにatomicAddをif文とか分岐が多くなるような文章内でつかうと、
今回でいえばcounterのアドレスがかわるということですか??
653 :
デフォルトの名無しさん :2010/03/19(金) 07:46:47
Dual-GPUとSingle-GPUを比べてる時点でアウト
655 :
デフォルトの名無しさん :2010/03/19(金) 10:34:24
1スロットどうしの比較だから問題ない
>>655 それを言い出すと、TeslaDが出てくるぞ。ブリッジ自体は1スロットだからなw
657 :
デフォルトの名無しさん :2010/03/19(金) 11:22:52
はいはい、負け惜しみ 単純な計算性能では圧倒的にラデオンのほうが優れているんだよ
比較対象にHD5870が入っていない時点で なんか違和感があるんだが
Tesla C1070ってなに?Fermi?
GT200じゃなかった?
高い・遅い・熱い
S1070ってGT200×4の奴だろ。
665 :
デフォルトの名無しさん :2010/03/20(土) 17:28:11
CPUでの計算にインテルコンパイラを使いたいのですが、どのようにすればいいのでありまするか?
667 :
662 :2010/03/20(土) 20:32:56
>>666 nvcc -cで*.cuをコンパイルしたら、できた*.oをiccでリンクすればいい。
Windowsの場合はnvccもiccも別々にオブジェクトを作ることになるからそれをVCでリンク。
利用者はCUDAなんて独占的技術を求めてませんよね
まして永久β版のSDKなんて論外
まあ利用者だけが決めるわけでもないのも悲しいけど現実なのよね
なんか面白いことに使えないかな もったいない
「何かには使える」って言ってるうちは何にも使えないまま終わるんですけどね。 ターゲットアプリケーションがあってはじめて、そのニーズに合わせてハードの機能・性能の拡充が行われうるわけで 今までであればゲームがそうだった。 ウン十並列のデータを同時処理するような用途のニーズが仮に高まってるとしても それはCPUのSIMD拡張によってもカバーできるでしょ
674 :
デフォルトの名無しさん :2010/03/21(日) 08:51:43
Linuxでドライバのバージョンを調べる方法を教えてください
もう少し具体的に聞かないと・・・・。
676 :
デフォルトの名無しさん :2010/03/21(日) 09:00:06
ドライバのバージョンによって、振る舞いを変えたいので、 UbuntuでGPUのドライバのバージョンをプログラム上から調べる方法を教えてください
Ubuntu限定な必要があるかどうかはともかく、ドライバ自体のバージョンを知るAPIは用意されていません。 /usr/lib64のディレクトリでlibcuda.so.* のレギュラーファイルを探すのが確実かと思います。
CUDA実行環境がインストールされてるかどうかを調べてライブラリを遅延ロードできるような仕組みを 標準で用意して欲しいかな
Fermi対応版か 肝心のブツが手元にまわってくるかも怪しいのに
deviceQueryがあるじゃん
Fermiは、入手しやすくなるまで松わ。 初物は爆熱で卒倒価格だろうし。
俺は特攻する 470か480かが問題 そもそも手に入るのか、という話もあるが
そうか。取り合えず貼っておかねばなるまい
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::。:::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::。::::::...... ... --─- :::::::::::::::::::: ..::::: . ..::::::::
:::::::::::::::::...... ....:::::::゜::::::::::.. (___ )(___ ) ::::。::::::::::::::::: ゜.::::::::::::
:. .:::::。:::........ . .::::::::::::::::: _ i/ = =ヽi :::::::::::::。::::::::::: . . . ..::::
:::: :::::::::.....:☆彡:::: //[|| 」 ||]
>>683 ::::::::::゜:::::::::: ...:: :::::
:::::::::::::::::: . . . ..: :::: / ヘ | | ____,ヽ | | :::::::::::.... .... .. .::::::::::::::
::::::...゜ . .::::::::: /ヽ ノ ヽ__/ ....... . .::::::::::::........ ..::::
:.... .... .. . く / 三三三∠⌒>:.... .... .. .:.... .... ..
:.... .... ..:.... .... ..... .... .. .:.... .... .. ..... .... .. ..... ............. .. . ........ ......
:.... . ∧∧ ∧∧ ∧∧ ∧∧ .... .... .. .:.... .... ..... .... .. .
... ..:( )ゝ ( )ゝ( )ゝ( )ゝ無茶しやがって… ..........
.... i⌒ / i⌒ / i⌒ / i⌒ / .. ..... ................... .. . ...
.. 三 | 三 | 三 | 三 | ... ............. ........... . .....
... ∪ ∪ ∪ ∪ ∪ ∪ ∪ ∪ ............. ............. .. ........ ...
三三 三三 三三 三三
三三 三三 三三 三三
どう微妙なんだい
なんか膨大な演算能力は殆ど遊んでいるな。 こういう用途なら演算機減らした方が、電力効率的にはマシになるんじゃ。
ha?
え?
ま、近い将来fermiに置き換わるんだろ
>>685 1GPUあたり44.3GFlopsかぁ。維持で対応したって感じだ。
浮動小数点演算速度が3.22TFLOPSなのか?
それでもCPUより80倍の実行性能なんだね
6時間の気象モデルが70分で終了するなら 同じ気象モデルを使えばリアルタイム予測が可能?
偏微分方程式の数値解法をやる大学院生の演習課題みたいなもんですなw
気象問題って、ノード間の影響はどうなの? TESLAって結局PCI Expressで繋がっているから、 レイテンシが大きそうだな。
とりあえず運用してノウハウ貯めて、 28nmのFermi2で一気にパワーアップってのがいいんじゃないか? 明確なハズレ世代を大量導入するのはちとどうかと。
>>687 そういうのは GPU 以外に期待した方がいいんじゃないの?
電力効率なんて気にしたせいでピーク性能が落ちてゲームユーザが買わなくなったら、GPU の市場自体が崩壊するよ。
>>696 レイテンシを隠蔽するようにcode組んだらしい
>>693 これがよくわからんな。
なんで80倍なんだろう?
G200って倍精度の理論値って80Gflops位じゃなかった?
それに対してCPUが10Gflopsだろ。
8倍の間違いじゃないのか?
倍精度もハードウェアで本格対応して500GFLOPSになったんじゃないの
と思ったけどFermi世代からで、G200世代のものは90GFLOPS程度みたいだね。
これで倍精度で44.3GFLOPSなら効率50%近くということになるし
アルゴリズムとかかなり頑張っただろうね。
>>701 シェアードメモリをうまく使ったり、大量のスレッドでノード間のレイテンシを隠蔽したり
帯域がボトルネックになりにくいように出来たからじゃないの。
スカラープロセッサは、流体力学とか多体問題とかの
計算結果を相互に利用しながら並列計算する場合には
帯域がボトルネックになって効率がかなり低くなりがちらしいし、
比較対象のCPUを使ったシステムは効率が10%を下回っていたとかかも。
完全に並列化できて帯域がボトルネックになりにくい演算の場合は
10〜20倍という話だったかな。
>>703 メモリ帯域が問題になるのはよくわかるんだけど、
それも今のNehalemあたりは30GB/sぐらいあるから、
精々teslsaとは5倍くらいだろう。
それだとメモリ転送時間は1/5、計算時間が1/8になるとして、
CPUのメモリ転送時間をA、計算時間をBとすれば、
実行時間は単純にするとC=A+Bになる。
GPUの場合はCg=0.2A+0.125Bになる。
A=10Bとしたとしても5倍程度にしかならない様な気がするなあ。
CPUの場合巨大なキャッシュがあるし、プリフェッチもあるから
その差が縮まるはずなんだけどな。
東工大のクラスのだからCPUのコードがくそだということもなさそうだから、
なんかOpteronのCPU1コアと比較してそうだなあ。
と思っていたら、
>>702 が書いてくれているね。
比較するCPUが遅すぎたわけか
このcpuの速度は、普通にべたべたfpu演算を書いたときの数字だね。 理研の姫野ベンチ並みのバカコードと対照させても意味がない。 Linpackで最近のcpuをベンチマークすると、理論値の8掛け程度の数字は出る。 TUBAMEのopteronも1コアあたり10GFlops前後。しかも倍精度で。 Linpackに比べて気象エミュは速度が上がらんのは間違いないが、 この青木とやらの記事は全然ダメだ。 nVIDIAが成果としてレファできないレベル。
707 :
デフォルトの名無しさん :2010/03/26(金) 08:52:49
CPUというのは全然チューニングしてないレファレンスコードだろ。 よく使う手。しかもCPU名すら書いてない。 ベンチマークには2種類ある。嘘か大嘘。
PPTを見ると、44.3GFLOPSは単精度、倍精度では15GFLOPSだね。 比較のCPUは倍精度で0.5GFLOPS以下で、単精度の44.3GFLOPSと比較し、80倍以上といってるんだね。 青木いい加減にしろよw
これはひどい。
>>704 この手の計算の場合はCPUのキャッシュやプリフェッチはあまり効果が無いと思うけど
Nehalemだと30GB/s程度メモリ帯域があるのか。
ただCUDAでは単なるメモリ帯域の比較だけでなく、シェアードメモリの利用や
大量のスレッドによるメモリアクセスレイテンシの隠蔽が重要になってくると思う。
>702の記事見たけど、デュアルコア2.4GHzのOpteronの1コアと
TESLA S1070の中の1基の比較なのかな・・・
>>708 倍精度だと思ったら、単精度だったのか・・・
そのpptってどこで公開されているんだろ?
倍精度でも30ばいかい?
なんでみんなプレスリリースくらい読まないの? 不思議
>>708 おいおい・・・まじかよ。
かなり酷いなあ。まだ騙すことは出来るかもしれないが、
これがばれてくると偉いことになるぞ。
そういえばNVIDIAのGPUカンファレンスでCPUの2000倍速くなりましたってのがあったが、
Tesrax4、Opteron 2.4GHz 1Coreのものだった。
かなりつっこまれていたよ。
で、GPUは最適化しましたけど、実はCPUは最適化してませんだった。
>>710 この手の計算はどちらかというとストリーミングに近いから、
キャッシュやプリフェッチは十分効くよ。
特にハードウェアプリフェッチはかなり効果的だよ。
ただ、SSEを使ってしまったりすると、計算時間を隠蔽できなくなって、
今度は転送時間を隠蔽する方法を考えなくてはならなくなる。
Nehalemの中でも2000MHzのメモリに対応したものであれば、
48GB/sにもなるよ。このあたりはオーバークロック気味になるので、
コンシューマレベルでしかないけどね。
GPUを使うのを否定はしないが、いい加減嘘に近い誇張は止めてもらいたいものだ。
数倍でもいいだろう。2倍でも2日かかったものが1日で終わるんだぜ。
あんまり速いと仕事が増えるじゃねぇか!
嘘は言ってないんだよな 比較対象が微妙すぎるだけで CPUでも効率を出すのが難しい問題はあるから、両方ともきちんとチューニングした上で比較するのが理想ではある まあXX倍という数字が一人歩きするのはよくないね
実際、某社でなりかけている。 私の現場では、寧ろ旧世代のCPUを積んだサーバ機をGPUで延命させるってシナリオだから 処理能力は1.5倍でも御の字さw まぁ、実際のところはXeon1core対比で5倍程度は出たから サーバ機一台で換算してなんとか2倍(5+1*3 vs 4)の数字は出たけど。
>>715 結局実装アルゴリズムによるけど、
プリフェッチはかなり効くよ。
最後の2行はすごく同意だな。
わかっていない人からすると、GPU使えば数10倍になるはずと思ったりするので、
有能な奴が5倍速い書いたコードを書いたとしても相対的に低いと評価されそうだ。
>>716 たぶんこういう使い方が一番いいのかもね。
>>715 CPU比ではそうかもしれんが
AMD比ではかなりしょぼくないか?w
GTX 470欲しいな。でもどうせ瞬殺なんでしょ? いいよな秋葉原に住んでるおまえらは
>>716 GPUで延命→鯖予算獲得→新鯖にGPU移植
の流れが理想
GPGPUでの性能評価の指針って明確に定められないのかね CPU単一コア,レファレンスコードと比較して何倍速くなったと言っても, そんな条件で計算すること自体なさそうなんで,意味無い気がするんだが GPUでチューニングするなら,CPUでもチューニングするべきだろう
AMDかintelかでめんどくさいからじゃない
>>722 CPUまでチューニングする必要はないと思うけど、
気象コードがMPIで並列化されてないとも思えないし、1GPU内でも相当の並列化を行ってるんだから、
CPUの1コアのみと比較するのは、ちょっとやりすぎ。
で実際Xeon/X5570と倍精度で比較したら、単一コアで10倍程度、4コアで3倍程度のアドバンテージしかないんじゃない。
ノード単位だと逆に遅くなるとか。120GPUの3.2TFLOPSも単精度だし…、比較自体を都合のいいように、いいとこどりしすぎ。
ベンチマークだけでなく、せっかく実アプリをフルGPU化したのは十分意味があるのに、世間受けを狙いすぎた発表で逆に良識を疑ってしまう。
第三者(?)が書いた記事よりも NVIDIAの発表のほうがまだ信頼できるな。
詐欺師の言葉のほうが信頼があるとはこれ如何に
詐欺師はお客様に信用されなければいけない。 だから最低限の嘘しかつかない。 大道芸人は嘘をつくたびに金をもらえる。 だからいくらでも嘘をつく。
728 :
デフォルトの名無しさん :2010/03/27(土) 18:47:44
モックアップNVIDIAとうそつきが多い野心的な学者連中の たわ言なんて信用できないよな
数字なんていくらでもいじれるんですよ! 信用のあるデータが欲しいなら自分で実測するしかない
つまりそのデータを公開しても 誰も信じないってわけね
その通り! よく分かってるじゃん 論文だって他人の実験の結果なんて基本誰も信用しないよ とりあえず自分で再現実験してみるのは常識
そしてその論文も誰も信用しない
利害を共にしない数十人の人が 方法の妥当性を検証し、追試し、同じ結果が出て初めて ある程度の信用を得る それでも「ある程度」なのが学問の厳しい所だ
735 :
デフォルトの名無しさん :2010/03/27(土) 21:40:16
GPUは1コアだと思いますよ。TESRA内でもGPU同士はPCI越しなんで 遅くなると思います。 3000x3000x50って1GPUにおさまるサイズと思うし
736 :
デフォルトの名無しさん :2010/03/27(土) 21:41:34
誰も追試できないと思っているから舐めているんだろ。 今後は青木の言うことはハイハイワロスだな。
737 :
デフォルトの名無しさん :2010/03/27(土) 21:43:30
>>735 それだったら120GPUの意味がないだろ。
あと、Teslaな
738 :
デフォルトの名無しさん :2010/03/27(土) 21:49:48
いくつかの別な測定を同じ測定かもしれない感じで書くのはテクニックじゃないですか 1GPUで44.3GFLOPSなのに120GPUでなんで3.22TFLOPSなんでしょうか。
Zotac GeForce GTX 480 Amazon.comでPre Order $499だったから 申し込んでしまったw (米→日転送業者使用)
結局512spじゃなかったねGTX480
Ultraがくる
>>740 最初から、576にしておけばよかったのにね。
32x18で。2ブロックダメでも512で出せるのに。
そんなことしたらますますイールドが悪くなるわけで。
744 :
デフォルトの名無しさん :2010/03/29(月) 11:43:02
1CUDAコア破損しただけで32個分が台無しになるFermi 512すべて無事なのはほとんどないんだろうな
PS3と同じ作戦でござる。 ____________ ヾミ || || || || || || || ,l,,l,,l 川〃彡| V~~''-山┴''''""~ ヾニニ彡| 512SPは存在する・・・・・・! / 二ー―''二 ヾニニ┤ 存在するが・・・ <'-.,  ̄ ̄ _,,,..-‐、 〉ニニ| 今回 まだ 全部有効にするとの /"''-ニ,‐l l`__ニ-‐'''""` /ニ二| 指定まではしていない | ===、! `=====、 l =lべ=| . | `ー゚‐'/ `ー‐゚―' l.=lへ|~| そのことを |`ー‐/ `ー―― H<,〉|=| どうか諸君らも | / 、 l|__ノー| 思い出していただきたい . | /`ー ~ ′ \ .|ヾ.ニ|ヽ |l 下王l王l王l王lヲ| | ヾ_,| \ つまり・・・・ . | ≡ | `l \__ 我々がその気になれば !、 _,,..-'′ /l | ~''' FermiのSP数は ‐''" ̄| `iー-..,,,_,,,,,....-‐'''" / | | 320SP 384SP ということも -―| |\ / | | 可能だろう・・・・・・・・・・ということ・・・・! | | \ / | |
____ |<三`'ヨ′ _/6|ー廿┤ /l ̄ KL.三.」 ̄h . / | レ兮y′/ l 〈 く ∨ l/ ,イ | \_,.>、 /,L..」_ . 0ニニニ)而}ニニニニニ),リリニニ) . L| |_____|____| | l | |._______| | ,: , l \ヽ l | , '/ ;' :, ____l_|_|_;_|_|___|_|__ ; |\゙;三三゙';三三三,;゙三三\ ;' |\\三三゙三ジジ三三,''三;'\,;' ;' |、 \\三゙;三三ジジ・'三三三;\ ; 0ト、\\\;'三三;'三三三;''三三,;'\ \\\| 炎炎炎炎炎炎炎炎炎 | \\| 二I二二I二二I二二I二 | \LI二二I二二I二二I二二」 0」 0」
747 :
デフォルトの名無しさん :2010/03/30(火) 10:14:08
NVDIAフォーラムでGTX480の倍精度性能はTeslaの1/4という発言が ありますがどうなんでしょう
>>747 おれ、人柱としてぽちったから待っててくれ。
>>748 俺はお前を待っているぞ
+ +
∧_∧ +
(0゚・∀・) ワクワクテカテカ
(0゚∪ ∪ +
と__)__) +
Quadroと同じ戦略か。 妥当っちゃ妥当だな
751 :
デフォルトの名無しさん :2010/03/30(火) 12:00:52
EECだけでなく倍精度も性能を劣化させたのか GPGPUの利点がどんどんなくなってるな
>>749 あ、748なんだけど、さすがにTesla買う金は無いのよ。
なんか、GTX480で動かして「明らかに倍精度の性能落としてやがる!!!11」と
分かるプログラムはどこかにあるかな。
Teslaもないと比べようがなくね? visual profilerの関数の実行時間を比較くらいしか厳密な計測はできなさそう。
754 :
753 :2010/03/30(火) 12:22:12
リーロードしてなかった、悪気はないんだw
755 :
デフォルトの名無しさん :2010/03/30(火) 12:34:45
NVIDIA_GPU_Computing_SDK/C/bin/linux/release$ ./matrixMul Processing time: 0.120000 (ms) Test PASSED Press ENTER to exit... あたりを倍精度化してもらえばいいかと
>>753 かぶって申し訳ないww
おれ
>>739 なんだけど、失敗かな。日本で入手可能になるのを
待ったほうが早くて安かったかもしんないよなorz
>>755 おけ、matrixMulでGTX280とGTX480の比較ならやってさしあげられる。
floatのままと、doubleに全部置換した版で。
floatは内部で型変換してるからdoubleの方が早いって聞いた事あるんだけど…
倍精度のFMAをひたすら繰り返す感じのカーネルで計測するのがよいかと。
>>758 どこかのCPUでintをdoubleに変換してたという話かと。
しかし、480SPとか、AMDはリアル12コアだとか、 時代の進歩は速いものだな。
762 :
デフォルトの名無しさん :2010/03/30(火) 14:06:01
しかし、性能はGTX295から毛の生えた程度 ていうか、もし倍精度の性能がいまいちだったらGTX480/470より GTX295を買ったほうが安くていいかもね
763 :
デフォルトの名無しさん :2010/03/30(火) 14:14:19
長崎大のようなことをやられたらNVDIAが東工大から呼出をうけて 「2度目はないからな」とか言われても不思議じゃないよね
>>762 GTX295、5万円くらいだからなぁ。倍精度の性能がGTX280の2倍程度ならば…
GTX295でヨシってことになると。
>>757 よろしく!
matrixMulはメインメモリの転送が時間に含まれてるしサイズが小さめ プログラムが書けるなら1000x1000あたりの性能をお願いします
>>760 そうなのか?
普通のCPUの構造上浮動小数点演算は、
64bitでやるから型変換をしてると聞いたんだけど
もしかしてGPUだと話は別なのかな…
>>766 x86アーキテクチャでは、普通は変数型に関わらず浮動小数点演算は80bitの拡張倍精度で行う。
メモリロード/ストアの際に、変数がfloat型ならfloat型に変換されはするが、
別に大した処理でもないので速度にそんな影響は出なかったと思うが。
R3000かなんかで64bitint乗算がなくてとかなかったっけ
>>767 GPU だとどころか、倍精度演算器が載ってない CPU だってあるから。
処理系によって話が別。
device emulationってなくなっちゃうのね
ちょっと整理。 ・x86(fpu) 浮動小数点レジスタが80bitなので、floatを突っ込んでも80bitで演算する。 従って、floatとの変換処理が入るのでdoubleの方が速いことがしばしば。 ・x86(sse) MMXレジスタが汎用なので、floatはfloatのまま演算する。 従って、定数や標準関数でdoubleに汚染されないように気をつければfloatの方が多少速くなる。 また、MMXレジスタにfloatの方が2倍詰め込めるのでベクタ化した場合に2倍速くなる可能性もある。 更に、キャッシュ効率もよくなるのでより速くなるかもしれない。 ・GPU(cuda) 単精度レジスタと倍精度レジスタが分かれているんだっけ? 倍精度についてよく知らんのでフォローお願い。 演算器の特性上、単精度の方がずっと高速に演算するし、転送量も当然半分にできる。 応用にも拠るけれど、CPUとのI/Fは単精度で内部だけ倍精度にできると最強かも。
64bit版gccだと、-m32オプションをつけない限りもはやx87のコードは吐かないなあ。 >CPUとのI/Fは単精度で内部だけ倍精度にできると最強かも。 これって何回丸めが発生するかによるけど、精度は単精度+αだね。 でもこういうことはよくやるなあ。 データ量を減らしたくて少し精度が欲しい場合は、最終的に欲しいデータはfloatで持っておいて、 計算するときにすべてdouble型のデータにコピーして最後に結果をfloat型に戻す。 この方法をとれば、丸め誤差の発生は一回で済む。 計算の中身が超越関数使ったり、複雑であったりすると結構有効だよ。 その分速度は犠牲になるけど、メモリ帯域が支配的であると余り影響がないな。 G200系だとまだ効果はないだろうけど、Fermiなら結構役に立つんでない?
>・x86(fpu) >浮動小数点レジスタが80bitなので、floatを突っ込んでも80bitで演算する。 >従って、floatとの変換処理が入るのでdoubleの方が速いことがしばしば。 doubleは64bitなんだから結局まるめが入るのは同じじゃないの?
おいおいあれだけCPU側のコードが糞だといっておいて、CPUのこと知らなさすぎだろw floatが遅くなるのは、MSVCが、floatのときは毎回メモリに書き戻すことで精度を32bitに落としてIEEE互換にするコードを出すから レジスタ間ならfloat/double/long double関係なく80bit
776 :
デフォルトの名無しさん :2010/03/31(水) 14:32:17
GPUの種類を取得する関数か何かはありませんか?
>>776 サンプルでついてくるdeviceQueryのソース読んでみれば
>>776 CUDA APIガイドに書いてあるだろ
779 :
デフォルトの名無しさん :2010/03/31(水) 15:12:11
そうじゃなくて製品名です
製品名って、ASUSかEVGAか判別したいってこと??
メーカーの判別はどうがんばっても無理だろ
782 :
デフォルトの名無しさん :2010/03/31(水) 15:32:47
じゃあせめてWindowsかMacかInaxかぐらいわかりませんか?
製品名って言うくらいだから、ELSA GLADIAC 998 GTX Plus V2 512MBみたいなのじゃないのか。
>>782 CUDA以前の問題。てか、そのレベルじゃ絶対無理だろ。
#ifdef _WIN32
まさかOpenCLの話か? #ifdef _apple とかやった覚えがある。
787 :
デフォルトの名無しさん :2010/03/31(水) 16:15:17
#ifdef _appleは豆知識だな
Inax は釣りだろ。782 は偽者じゃないか? TOTO 向けと別の最適化するのかなw
水流をGPUでシミュレーションして最適化するのか
流体シミュレーションはGPGPUのメインテーマだから、まさにうってつけだろう
OpenCL使えよ馬鹿ども
日本の便器メーカーは水量削減に血道を上げているからな いかに少ない水量で、効率良く、かつきっちり排泄物を流しきるか
便器開発での計算に使用するだけでなく、 便器自体にTeslaを搭載し、 排泄物を画像認識して最適な水流を計算する。 排熱も有効利用できそうだ
確かに、今は節水ということで一般家庭向けの便器は 流れが悪いといくことを感じるな。 現場では流体演算とかして設計しているのだろうか?
流体どころか三相全てシミュレートしてるんだな
GTX470が先に発売されるみたいですね。 購入される方いますか。
どうしてcudaはosと密接なのか? 最新のubuntuをいれたくてもいれられへん 理由を教えてくれろ
801 :
デフォルトの名無しさん :2010/04/01(木) 19:55:02
>>797 固体ってのが生々しいな。シミュレーションするためにウンコの物性とか
測定したりしたんだろうな。
壊れ方とかがリアルな模型があるとか聞いたことがある。 でも物体の測定データのファイル名とかはなまなましいだろうなw シミュレーションしているときのSSとかあればいいのに。
たしか法律で、流す水の量は決まってるんだよね。
>>799 たぶん、nvccがgccの進化について行けていないだけだと思う。
バイナリだけなら、最新のUbuntuでも動くよ。
805 :
デフォルトの名無しさん :2010/04/02(金) 16:58:24
最近のディストリビューションって大抵1年かそこらでサポート終わりじゃん。 1つまえのバージョンにしか入れられないと、半年程度でいれかえなきゃいけないんだよね。 そこらへんを早く何とかしてくれよ。 CentOSとかつかえばいいのかもしれんけど
そこを何とかしてもらいたいね。 俺は古いバージョンのLinuxをVirtualBoxで新しいバージョンのLinux上で動かして、 クロスコンパイルライクなことをしているよ。コンパイルだけなら仮想化環境でも通るからな。
GTX480で倍精度削られたのは本当らしい… Quadroではどうなるんだろう
Q1.同じGT-240を二枚挿せばCUDAも倍近く早く処理できるようになりますか? Q2.GDDR5とGDDR3とDDR3でCUDA動画エンコードの処理スピードはどれくらい 違いますか?GDDR3を100として。
>>810 もう少し具体的に知りたいことを書いた方が答えやすい。
例えば動画エンコード用途に限ると「複数枚挿しはどうよ?」とか、「FermiとかATIとかの中でどれが一番速いか」とか。
十分具体的だろ・・・。 ソフトウェアによって、複数挿に対応しているかどうかは変わるので、 使いたいソフトについて調べよう。 メモリの速さは重要だけど、GPGPUでは、メモリにアクセスするときの遅延のほうが問題となっている。 ハードウェアの構造的にもGT200系のほうがメモリアクセスが柔軟なので、GTX260あたりを検討してはどうだろう。
具体的だろと言っておきながらソフトによって変わるとか意味不明
>>811-812 レスありがとうございます。
CUDAの使用目的:動画エンコのみ。 使用するソフト:MediaCoder
使用するかもしれないソフト:TMPGEncKarmaPlus
現状:AVIUTLでロゴ消しとインタレ解除のプロジェクト→
TMPGEnc4で色γクロップ・リサイズしてHUFFYUVで出力→MediaCoderのx264で。
課題:Q6600でVGAでx264エンコが22fpsしか出ない。1080pだと4fps!orz
MediaCoderにCUDAでH.264エンコできる機能があるので使いたい。
GT240がGDDR3で6000円、GDDR5で7500円〜なので、二台組むより二枚入れた
ほうがいいのかも?
GDDR3とGDDR5でCUDAエンコに殆ど差がないならGDDR3のほうにしたい。
複数枚挿しはどうです?
現状G43/G41/G31なので新しくマザー買わなきゃできないけど…。
>>812 GPGPUやメモリアクセスについて仕組みとか全く知らないのですが、
GTX260はGT240の倍以上の値段だけど、倍の性能あるんですか?
wikiに書いてあるSPとCUDAコア数がどう違うのか分からないので…
もし倍の性能(エンコが倍早くなりそう)ならGT240よりGTX260を選ぶかも
しれません。PXI-EXOが1つですむし。
>>810 素直にCorei7にしておけ。
GT240じゃ2枚さそうがCorei7の方がマシだ。
現状CPUを強化したほうがメリット多い CUDA使うならGTX260以上じゃないとCPUの足を引張る可能性がある
aviutlでの処理時間考えたらCPU強化の方が妥当だな
>>818 あ〜、俺もこれ使ってcudaエンコしてるけど、Bフレームが4までだったり2passできなかったり
画質はいまいちですよん。たしかにCPUよりは速いとはおもうけど・・・。
新しいバージョンだと改善されてる可能性はあるけどね。
>>814 GT240の3倍くらいの値段で売られているが、3倍速くなるとはいえないけど、
MediaCoderは複数差対応していなし、GT240を2枚買っても無駄になる。
あたらしくマザー買う予算が削れるならGTX260でもいいかと。
画質もとめるなら、i7ってのは合意。
821 :
810 :2010/04/04(日) 14:18:33
822 :
810 :2010/04/04(日) 14:19:49
>>819 最新ではBフレームが16まで、Average/Variable/CBR/2pass/3pass できるみたいだよ。
x264ではAverage/Variableは何故かコマ落ちする。
>>820 SP216&DDR3のGTX260とCUDAコア数96のGT240だと、エンコ速度二倍差が出ます?
PHARAOH 500W電源だとGTX260+Q6600はギリギリかなぁ。
(Q6600+GT240)複数台にするほうが経済的かな? G41とDDR2が1組余ってるし…
これは低すぎるのでOpenCLでDoubleがHWサポート されてないのではないかと
>>821 GDDR3とGDDR5とでは、メモリ帯域が倍違うので、ストリーム系のアプリでは大きく変わります。
ていうか、このクラスのボードで2枚挿しとか意味がない。
>823−824 むしろ理論値で単精度の5分の1になるはずのRADEONの倍精度が半分程度で済んでる方が気になる >822 GT240なんてゴミ買うぐらいならいっそ中古のQ9xxxのCPUでも買った方が良くね?
安物買いの銭失いとはこのこと CUDAに大きな期待を抱かないほうがいい
>>823 で、GTX295が285よりもスコア低いのはなぜ?
>>828 単純にGPUを一個しか使っていないからだと思う。
単一GPUなら285の方が速いからね。
>>825 CUDAエンコはストリームと違ってGDDR3もGDDR5殆ど関係無いってさ。
SP数(CUDAコア数)でほとんど性能が決まる。
>>827 最新のMediaCoderでVBRでやってみたらどう?
MLB オバマ始球式
832 :
デフォルトの名無しさん :2010/04/07(水) 09:15:06
HPC向けGPGPU終わりつつあるな
102 :Socket774 :sage :2010/04/06(火) 23:24:12 ID:n4owrnuu
>>98 > HPC向けはどうなるんだろう?
マキーノの話だとこんなのが。
http://grape.mtk.nao.ac.jp/~makino/journal/journal-2010-04.html#3 > 一枚5万とかで買うのでない限り GPU は価格性能比では CPU に勝てなくなってしまった
以前はGPUの方が同コストのCPU比で10倍↑とか軽く叩き出してたけど、
CPUはマルチコア化が進みまくり値段下がりまくり…
ハイエンドGPGPU買うよりCPUの方がコスパが良くなってしまった。
基本直線番長のGPGPUよりCPUの方が扱いやすいし、プログラミングも先行きわからない
CUDAやらなくても、今までやってきた事そのままで走るし…
確かに、OpenMPとかでそれなりに性能出るならそっちの方が超簡単だもんな。
精度を削って性能を出したマシンで有名になったのにこういう時は倍精度の話だけか
836 :
デフォルトの名無しさん :2010/04/07(水) 15:29:03
>>835 CUDAエンコは実用性ゼロと言われているだろ
HPC以外の分野でCUDAを利用している人はいないだろ
>>834 そこ大事だよな。CPUと違って、倍精度・単精度の使い分けで性能違うもんな。
て、マキーノは昔、計算パスの場所によって計算精度が違う計算機を作ってたもんな
>>836 エンコの中の人が面倒くさがっているだけなんじゃないの
>>838 環境を作るのがめんどくさい。
コードを書き換えるのがめんどくさい。
最適化するのがめんどくさい。
840 :
デフォルトの名無しさん :2010/04/07(水) 15:45:24
>>838 まともなエンコを利用できないという事実が重要
841 :
デフォルトの名無しさん :2010/04/07(水) 18:57:43
たしかにOpteron12コアX4がFermiと同じ値段ならGPU終わるな。 既存のコードがそのまま動くし。 CUDAでこれ以上の性能が出るアプリは限られている。
fermiの場合ボッタクリなだけのような。 最終的にはfusionみたいな物に落ち着くだろうけど。 GPUのアーキテクチャとしては変に汎用に振るより コンパクトな割に暗号解読みたいに得意なものが速い と言う方が良いだろう。
>>838 正直エンコにCUDAを適応出来る処理が少なすぎる
x264の開発者が全員RADE愛好者だったとかいうオチなら面白い
>>839 ペガシスがKarmaPlusに導入したCUDAエンコをTXP4になかなか導入
しないのはそれが原因かw
846 :
デフォルトの名無しさん :2010/04/08(木) 00:28:04
>>841 メニーコア化が進展すればGPUは終わるよね
実際のところ、全然進んでないからNVは助かっているけど
メニーコアのメニーの次元が、GPUとCPUじゃ、全然違うしな
新しいものが出てくるときはチャンスだと思うんだが、このスレではそんな気配かけらもないな。 やっぱり日本人てダメなのかね
849 :
デフォルトの名無しさん :2010/04/08(木) 00:53:43
だって、HPC向けはコストパフォーマンス悪いし GeForceは機能削られまくりだし、いまいちなんだよね
ATOM+IONチップセットで エンコ爆速になったりしないか
>>850 動画データの転送には最低でもPenDは必要。
>>848 バカンスの概念が無い日本人はここぞって時に余力が無い。
>>841 4万のマザーに32,480円の8コア載せるより
5千円のマザーに1.6万円の4コア載せて数万のビデオカード挿す方が数倍早い
んだろうし、どっちもムーアの法則どうり進化すればGPUは当分優勢では?
852 :
デフォルトの名無しさん :2010/04/08(木) 06:07:48
GPUで縁故するとなんであんなに汚いの?
ソースみたいとわからん。
SpursEngineでエンコして汚いのはハードのせい CUDAでエンコして汚い場合はソフトが成熟してないから
>>851 適材適所ってことだよなー
y=a*x+b を100万個×10万回 みたいな計算には巨大コアはいらない、
小さいコアがたくさんある方が速い みたいな。
>>851 なぜ今頃ムーアの法則?
成り立たなくなってかなり経つんだが
え?
あと10年ぐらいはどうにかなりそうな気がするけど
>>856 はfreelunchは終わった発言と混同しているに1000ペソ
>>860 どんだけ低クロックなんだよ、電算機系分野の10年ってものすげぇ進歩するんだぞ
クロック? ムーアの法則って集積密度の話じゃなかったっけ
ムーアの法則なんて、明らかに無理だと分かった時点で 定義の方を変えて無理やり存続させているだけだろ。
IntelはAMDの様子見して出し惜しみ&殿様商売 「半導体の集積密度は18〜24ヶ月で倍増する」ゆえ CPUの性能は2年で倍近くになる。1年だと√2倍弱 GPUも同様。
集積密度≠性能ということをきちんと理解しましょう
GPUで無理矢理あれこれするより、 計算専用のユニットを別途開発した方がいいんじゃないの?と思う GPUより効率よくできる部分もあるだろうし
∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
>>867 / ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
869 :
デフォルトの名無しさん :2010/04/09(金) 12:48:00
x264がCUDA対応してないことと、AVIUTLでCUDA使えないこと、 MediaCoderのcudaH264Enc.exeの画質をx264並みにするにはビットレートを 何割増しにすればいいのか不明なこと、 PowerDirectorは設定がゴミなこと、 が問題かな
871 :
デフォルトの名無しさん :2010/04/09(金) 17:18:50
倍精度だとteslaの1/4だけと、値段は1/5なんだよね
ノードの数がGTX480は480でteslaは442なんだよね
あれ、HD5870でよくね?
IEEE754準拠ではない64bit double floatはR7xxの頃からあった。 俺は使ったことないからわからないけど。 少なくともドキュメントには、Radeon HD4xxx を除外するような文言はなかった。 R8xxはIEEE754準拠の命令が結構揃ってるよ。
なんでラデはFFTのライブラリを出さないのか理由がわかりますか
つくれば?
ですよね
熱的にやめとけ。
売り切れたそうです。GTX480、3枚買った方がいるとか。
>>875 IEEE754準拠の精度になったのがRV770で
RV670のころからdoubleはサポートされているよ。
3枚とかアホとしかww
470なら3台行けるかなー
885 :
デフォルトの名無しさん :2010/04/10(土) 01:56:40
オークションで売るんじゃないか
PCI-EXx16 3つあるマザーでPCIと交互にあるマザーでCUDAエンコに 使うんだろう。
結局、倍精度は削られているのかね? 削られていなければ買いたいのだが。
まだ実測した人はいないみたいですね。スレの人が手に入れるのをまちましょう。
GTX480じゃ倍精度無効になっているだけで sandraのベンチのやつはEMUですが
無効じゃなくて1/4ですよね ベンチはOpenGLがそうなってるということで
OpenGLのなにが?
892 :
デフォルトの名無しさん :2010/04/10(土) 07:59:10
sandraのあれはOpenCLだろ>倍精度無効
sandraはOpenCLだろうがGLだろうがCUDAだろうがCSだろうがvideorenderingだろうが ハードで使えなきゃエミュでだすよ
895 :
デフォルトの名無しさん :2010/04/10(土) 08:54:56
>>894 ゲーム目的だったらHD5970を買ったほうがよかったのにね
M/Bとか貧弱なんでゲーマでもないみたいでなんで2枚も買ったのか
480/470の倍精度演算削られたのか… 倍精度演算やる人はぼったくり価格のC2050/2070買えってか
>>897 まぁ、このスレ住人が実際にCUDAで試すのを待とうや。
米アマゾンはまだ発売前になってるね
これだけ出回ってるのに倍精度はおろか単精度の演算を流す人もいないとは
出来る人はこんな所に来ない、つまりここは無能の衆が集う所だから
みんな科研費で買うんじゃない?5月まで待たないと.
無駄遣いはやめてもらうようにこのスレのことも仕分け人に伝えとかないといかんね
905 :
デフォルトの名無しさん :2010/04/11(日) 13:48:15
科研費が無駄に物価を高騰させてるな さっさと仕分けされろ
906 :
デフォルトの名無しさん :2010/04/11(日) 18:10:27
無駄な科学者・技術者は農業や林業にまわって効率を上げてやってほしい。
470ポチった。ついでにCUDAの入門書もポチった。
両方到着は14日予定。おまえらよろしく
>>897 倍精度のテストプログラムか何かあれば提示してくれないか?
手元にGeForce系列VGAが一切ないので一切やったことがないんだ
14日、期待してますよ。
人柱になってくれるのに情報薄くて申し訳ないが このスレの上の方にあるCUDA公式での行列かけ算コードを倍精度化したものを走らせるのが一番簡単かな? 手持ちがあれば提供したいが
未だELSAからボードが来ない……
911 :
デフォルトの名無しさん :2010/04/12(月) 14:48:20
480のCUDAのベンチマーク結果はどかでみられませんか? ゲームのベンチだといくらでもみつかるのですが。
_(こ^)、_ 〃、__ノノ、__,ヽ {.っ> <っト、 (⌒i (千于`ー┴'─────┐ (O人 `ー| | /⌒ヽ(^う 見せられ. | `ァー─イ ないよ! | / (0::|__________| /\____/ / / ⌒ヽ ___/ / ̄ ̄`) ノ (__r___ノ (.__つ
おk、14日・・・はWin7のセットアップなどもあるから無理として、15日か16日にはテストする
あいかわらず倍精度のベンチはないもののNVIDIAがコンフォームしたって書いてあるね
マーケティングの理由から倍精度つぶすとかやってくれるぜ全く くあどろも同じだったら本当に萎えるわ
やっぱり倍精度は1/4になっているのか。 Teslaだと高いしな。 Nehalemが6コア、8コアになってきて、Opteronは12コアになってきてしまったので、 CUDAの優位性がかなり下がってしまったな。
nvidiaは1世代分戦略を間違えた希ガス 社運をHPCに賭けるなら、Fermiは倍精度つぶさずにバーゲンするべきだった CUDAがある程度スタンダードになったことを確認した上で、Fermiの次をぼったくり価格にすれば良かったはず PCIExpress3.0対応にしてさ いまならCUDA捨てるの間に合うしなあ ユーザ側が リネーム商法といい、nvidiaはほんと強気だ
まじか。書いてあるな。萎えたな。 「NVIDIA has confirmed it - the GTX 400 series' FP64 performance is capped at 1/8th (12.5%) of its FP32 performance, as opposed to what the hardware natively can do of 1/2 (50%) FP32. 」
これまでの何倍速くなりました!というのがかなり限定されるのがわかって来たからね。メモリ帯域に関しても確かにCUDAが始まった頃は、CPUの10倍以上あって早かったけど、今はDual CPUだと大差無くなって来ているので、高価なTeslaを入れる意味も無いなあ。 前に誰かが書いていたけど、古いPCの延命のために使うのはありだと思うけど、ちょっと高いよなあ。 歩留まりが悪いのはわかるが。
結局、Fermiのほどまりは何%くらいで、普通は何%くらいなんですか?
922 :
デフォルトの名無しさん :2010/04/13(火) 11:55:56
>>921 不明
今後も確実なソースから数値が出る可能性はほぼゼロ
konozamaだったよ orz
926 :
822 :2010/04/13(火) 17:12:13
MediaCoder CUDAエンコ爆速www Q6600の6倍早いwww 画質x264と変わらんwww GTX260でCPU45〜51%使用www
ふどまり
どうやらこのスレが世界初GTX480/470CUDA倍精度性能実測報告スレとなりそうですね
929 :
907 :2010/04/15(木) 04:57:37
とりあえず470は明日到着予定。 けど、搭載予定のケースが明後日到着予定・・・ うきいいいいい 変な時間に起きてすることがない・・・
瞑想しろ
931 :
デフォルトの名無しさん :2010/04/15(木) 20:51:26
CUDA初心者です。 GTX295で2つのGPUを使用する場合、 cudaMemcpy (省略, cudaMemcpyDeviceToDevice); で2GPU間の直接メモリコピーはできないのでしょうか? せっかく1ボードにのっているのにCPUに戻すなんておかしいのではと思ってます。
おかしくはない。 2GPUといったって結局はPCIEで繋がっているから、 SLIで2枚繋がっているのと同じなんだよ。 しかもPCIEのバスはCPUのメモリバスと違って遅いから、 仮にDMAでアクセスできるようになっても10%くらいしか改善しないと思うよ。
933 :
931 :2010/04/16(金) 06:13:10
>>932 回答ありがとうございます。
質問がまずかったかもしれない(2GPUではなく2コアと言えばよかった)ので再質ですが、
2コア間のメモリコピーをCPUに戻さずできないものかということなんですが、
やっぱりおかしくないってことなのでしょうか?
>>933 2コアではなく、2GPUになる。
基本的に共有メモリではなく分散メモリ型になる。
なので、考え方としてはMPIを思えば理解しやすい。
たぶんやりたいことはインフィニバンドのRDMAのようなことなんだろうけど、
GTX295では無理だと思うよ。
ここにGTX295の分解写真がある。
http://www.4gamer.net/games/050/G005004/20090108044/screenshot.html?num=019 これを見ると、上のボードの左下に2枚のフレキケーブルがあるのがわかる。
これで2枚のボードが繋がっているわけ。たしかこのSLIってPCIEx1だった記憶がある。
(間違ってたらごめん)
つまり内部でSLI接続されているということ。なので2コアではなく2GPU。
おそらくフレキケーブルの一方がPCへの接続、もう一方がSLI接続。
これをみると上側のボードがマスターと思われるから、ひょっとしてGTX295は、
スレーブ側のGPUからCPUにデータを転送するのは時間がかかるのかもね。
>>931 GTX295-GTX295間でのメモリのやりとり
ではなくて、
GTX295内でのメモリのやりとり(例えばSM間でのメモリのやりとり)
についてもしかしたら聞いているのか?
わかりやすい解説乙
>>935 どう読んでも最初からそのようにしか読めない。
2GPU搭載のボードの話だろ。
残念ながら俺は答えを持ち合わせていないが。
938 :
932 :2010/04/16(金) 08:35:43
>>934 リンク先の写真みました。
なるほど、内部は2枚のGPU構成だったのね。
それが、SLIケーブルを介してつながっているわけですか・・・。
CUDAってSLIケーブルを使用できないんですかね?(できるかと思ってた)
そうすると、2コアではなく2GPUになるのだということになり、
PCIeを介しない2コア間のメモリ転送はできないと理解できます。
>>935 ありがと。コア間のメモリ転送について聞きたかったので、
SMについての質問ではないんです。
939 :
935 :2010/04/16(金) 09:03:34
GTX295が1ボードSLIである事を誤解していた 申し訳ない 俺がGTX280を複数組み合わすときはSLI使わずにCPUに戻している そんなわけで、もしSLIが使えて(性能向上するなら)俺も知りたい
SLIケーブルはそんな高速なデータ転送に使えるものではありません。 PCI-Expressデバイス同士の直接(ホストには行くかもしれないけどメモリには行かない)の データ転送は原理的には可能ですが、対応するCUDAのAPI関数はありません。
CPU、コアの増大、SIMD処理できる単位増加(128bit -> 256bit)などなど GPU的になってきていて、GPUへの転送を要しない分、GPUより高速な演算が可能になったりするのでは??
┐('〜`)┌ 何言ってるのかサッパリ
>>942 CPU には必要だが GPU には必要の無い機能というのは常に存在する。
するとGPU の方が相対的にコストパフォーマンスが高い分野というのは、結局いつまでも無くならない(特にラスタライズ)。
逆に GPU に必要で CPU に必要ない処理もある。
また GPU では必要とされない処理というのは、相対的に CPU の得意分野だといえるので、その点では GPU に対するアドバンテージがある。
計算機科学分野専用のアクセラレータとかないのん
あるよ。 正確にはあったかな。 クリアスピードとかCellのギガアクセルとか。 Teslaもいってみたら専用アクセラレータじゃない?
>>945 Cray XD1には、FPGA reconfigurable アクセラレータとかある。
Opteronのソケットに刺さるそうだ。PCI-eなんぞよりよほど速そうね。
FPGAとか、CPUが無駄に整数演算・論理演算しているところを
ものっそ小さく出来るのがいいよな。浮動小数点はダメだけど
そこら辺があるのにGPUで高速化とかニュースに出てくるのは コストがかかるとかもう最新のGPUのが速いとかそういうせいなのか
そこいら辺りはかなり高いし、やっぱり数という意味でGPUにはかなわないから高くなってしまう。 さらに今となってはCPU単体とそれほどアドバンテージがなくなってきてしまった。 GPUもそうなりつつあるけどね。
世知辛いのう
「アクセラレータ」系で商売になってるとこってあるのかな。 (更新までの電気代含む)コストパフォーマンスで明らかにCPUorGPUに勝つるところ、というか。
マキノ先生の関係者がやっているところがあるが 一般からの受注は厳しいだろうねきっと
コスト度外視で一次キャッシュを1GBくらいにしたCPUとか出ないかな
じゃあキャッシュを無くして、 一次キャッシュやレジスタで使われるような記憶装置を 主記憶装置にするとか
1000までに倍精度の報告が聞きたいです
>>955 L1キャッシュに使われてるトランジスタは1ビットに6〜8トランジスタ必要
単純にFLIP-FLOPだけで650億トランジスタ必要だな。
コストもだが消費電力が半端ないぞ
>>958 SpursEngineってプロセッサの数とクロックが半分くらいじゃなかったっけ?
だから1機で1/4くらいだと思うんだけど。
48*4=192gflopsやね
>>960 すごい話なんだがすごいと思わなくなってる自分はおかしい
SpursEngine×4で192gflopsね
CUDAとDirectComputeどっちが速く動く?
16コアすげーな
まさに4x4
っていうかSpursEngineのマルチチップ構成って PPE無いから、SPEはCPUが制御する感じなのかね?
968 :
942 :2010/04/17(土) 19:21:55
>>944 ありがとうございます。
住み分けがなされそうですね。
今週も決着せず来週に続く、みたいですね
並列性を極めると、1ビットALUとかになるのかな。if文とか最小リソースになるw doubleが必要なら、64個が組んで動くw
コネクションマシン(Connection Machine)
480の倍精度は意図的に速度が控えられているけど、floatを2つ使ってdoubleの精度を出すアルゴリズムはないのでしょうか?
英語のフォーラムでもじつは全部ソフトじゃねとか蒟蒻問答してる
doubleとfloatの速度を比較したベンチはどこかにないの?
そういえばCM-2も単精度が2倍速いのでわざわざそれを自慢してた
976 :
デフォルトの名無しさん :2010/04/18(日) 12:26:57
倍精度が必要ならAMDのマニクール買ったほうがはるかにコスパがいいな
CUDAの方が簡単に性能が出るプログラムもあります
MagnyCoursのコスパがよいはずがないだろう・・・
アプリによってはマニクールの方がコスパ良い可能性は十分にあるとおもうぞ
>>972 取り合えずIEEE754を調べて見よう。
多倍長も有るけど、それだと整数だしな。
>>979 Teslaと比べるならあるかもな。
8コアの安い奴のQuadでならこっちの方がなんでもできて速いだろう。
>>970 いやいや極めるならVLIWでしょう。
8192bitのVLIWとか見てみたいものだ!
983 :
デフォルトの名無しさん :2010/04/18(日) 17:16:06
>>977 tesla1枚買う金で、48コア(4CPU)マニクールが買えるけど
それに勝てるの?
そう言って売り込んでみれば? 無理だろうけど
985 :
デフォルトの名無しさん :2010/04/18(日) 17:31:57
利害関係者でもないのに売りこみなんてしないよ でも事実でしょ
どういう事実?
CPUのみの値段で比較?
988 :
デフォルトの名無しさん :2010/04/18(日) 17:40:17
teslaよりマニクールのほうが倍精度で性能を比較すれば ずっとリーズナブルだっていう事実
数字で出してよ
>>983 はTeslaとマニクールをそれぞれ幾らで買うつもりなのだろうか・・・。
991 :
デフォルトの名無しさん :2010/04/18(日) 17:43:15
面倒だから自分で詳細に出す気はないよ 信じたくないなら信じてもらえなくていいし
992 :
デフォルトの名無しさん :2010/04/18(日) 17:44:50
>>990 マニクールは8コアなら3,4万で買えるけど12コアのマニクールは
10万ぐらいしたはず
おいおい、比較したんだろ?
994 :
デフォルトの名無しさん :2010/04/18(日) 17:54:51
Opteron 6164 HEは約8万円ぐらいで販売されている 4使っても32万円ぐらい 今度出るtesla C2050の価格と同じくらい
6168 744*4=2976 1.9*12*4*2*2=364.8 6176se 1386*4=5544 2.3*12*4*2*2=441.6 c2050 2499 1.215*448=544.3
で、何を比較したんだ?
そもそもOpteronって倍精度積和算1サイクルでできるのか
998 :
デフォルトの名無しさん :2010/04/18(日) 18:10:53
>>996 プログラミングのしやすさまで考慮すれば圧倒的にCPUのみの構成
のほうがいいだろ
軽い気持ちで書きこんで悪かったよ、GPU信者さん
999 :
デフォルトの名無しさん :2010/04/18(日) 18:11:33
1000げと
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。