【GPGPU】くだすれCUDAスレ part8【NVIDIA】 [無断転載禁止]©2ch.net
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
CUDA使いが優しくコメントを返しますが、
お礼はCUDAの布教と初心者の救済をお願いします。
CUDA・HomePage
ttp://developer.nvidia.com/category/zone/cuda-zone
関連スレ
GPGPU#5
http://peace.2ch.net/test/read.cgi/tech/1281876470/
前スレ
【GPGPU】くだすれCUDAスレ【NVIDIA】
ttp://pc12.2ch.net/test/read.cgi/tech/1206152032/
【GPGPU】くだすれCUDAスレ pert2【NVIDIA】
ttp://pc12.2ch.net/test/read.cgi/tech/1254997777/
【GPGPU】くだすれCUDAスレ pert3【NVIDIA】
ttp://hibari.2ch.net/test/read.cgi/tech/1271587710/
【GPGPU】くだすれCUDAスレ pert4【NVIDIA】
ttp://hibari.2ch.net/test/read.cgi/tech/1291467433/
【GPGPU】くだすれCUDAスレ part5【NVIDIA】
http://toro.2ch.net/test/read.cgi/tech/1314104886/
【GPGPU】くだすれCUDAスレ part6【NVIDIA】
ttp://peace.2ch.net/test/read.cgi/tech/1348409867/
【GPGPU】くだすれCUDAスレ part7【NVIDIA】
http://echo.2ch.net/test/read.cgi/tech/1416492886/ intelのコンパイラ買えばCPUももうちょっとマシなんだろうけどケチってやってない。
GPUのメモリの量で、やれることとやれないことが変わってくるので
コア数クロック低くてもメモリ多いみたいなのがあればいいのにね パソコン工房のブログ記事に
RTX2060superを2枚使って、しかしSLIとかVLLinkとか使わずに性能1.8倍って例が出ている
34308番の記事か 1050で戦ってるが、ぐぐるこらぼの半分の速度しか出ねえ
今買い換えるならおすすめどれ?
3万くらいなら払えそう RTX3060デスクトップ版のコスパが
これまでのNVIDIAの一般ユーザー向けGPUでは深層学習に最適かな
3584cudaコアとVRAM12GBでアメリカ価格329ドルは有難い
教師データが巨大でも助かる
なおノート向けはcudaコアはちょっと多いがVRAM6GBなので注意
またRTX30xx番台はcuda11を使えばTensorflowを動かせるとのこと RTX3060良さそうだよな。
Google colab は無料なのは助かるけど、毎回環境構築しなきゃいけないし、やっぱりローカルで動かせると捗る。 3000番台はまだSLI出来るんだっけ
2060superでただ2枚挿しただけでとりあえず深層学習用途なら性能上がったというのが気になる
ノートPC用のRTX3080って16GBなんだなあ
是非欲しいけど当面は総額40万円くらいだろうな 機械学習しようとrtx3090を2枚買ったんだが中古でも25万円で売れるから売ってrtx A6000に買い替えるメリットある?
gpgpu的な観点から 3080tiと3070tiが販売されるか
しかし3080tiでもVRAM12GB ようやく
CPUマルチスレッドをCUDAプログラミングに乗り換えようと来てみたけど
ほんと人少ないな。
ompオフロードじゃなくCUDAでやろうとしてる
ちょっと思ったのはデバイス側のスレッドから、複数のデバイス側のスレッドを起動できれば
ホストデバイス間のメモリ転送をぐっと少なく出切るんだけど
こういうことって出来ないのかな?
__device__
void
SubThread()
{
...
}
__gloval__
void
SubThread()
{
} 途中で送信してしもた
__device__
void
SubThread(){
...
}
__gloval__
void
Thread(){
SubThread<<<1,1024>>>();
}
int
main(){
Thread<<<1,1>>>Thread();
}
みたいな。
これができないとCPUマルチコアプログラムからGPUプログラムに簡単に移行できんわ。
CPUもC#やインテルコンパイラから入ったんで、大体様子がわかって、
ompでは用意されてなかったPartitionerを先ず作ってめちゃ楽にコーディングできるようになった。
GPUはまだ手探り状態 細かく見てないけどSubThread をグローバルにしたら呼べる >>218
CUDA Dynamic Parallelism __device__を__global__に置換してみたけど
__global__内でスレッドを立ち上げるコードを書くと
THread内のSubThread<<<1,1024>>>(); 行と
main関数のThread<<<1,1>>>Thread(); 行の2箇所で"式が必要です"とコンパイルがエラーがでる
もちろん
Thread内のSubThread<<<1,1024>>>();をコメントアウトするとコンパイルもとおるし、正しく実行できる ようやくわかりました
Relocatable Deice Code をenableでコンパイルが通りました
あちがとうございました 今のGeForceは倍精度遅すぎてなんとかならんか?とおもてたら
Kelper世代のTeslaが8万円ぐらいで売ってるのな 1.8TFlps
c.f.
R3090 FP64 0.556TFPS ww なんそれッ k80とか外付けGPUBOXで正常動作すんのかな?
動作報告探してみたけど見つからないんでよくわからん
消費電力大きいし、使いたいときだけつないぎたい 8万円分AWSのGPUインスタンス借りたほうがよくね? 課金がアクセス時間なのか正味のGPU駆動時間かわからんけど
8万だとほぼほぼ1ケ月やね。k80本体は6.7万ってのを見つけたわ
機材レンタルじゃないのでもっと上衣スペックのGPUサービスとか期待してチェックしたけど
目ん玉飛び出るぐらい高いね。もっと安くしてくれ A100ならAWSよりGPUSOROBANが半額以下やね
22万/月なんて個人じゃ出せないけど 仮面ライダー GPGPU
https://pc.watch.impress.co.jp/docs/news/1396728.html
700Wて
10年たってジャンクで入手しても個人で稼動して遊べるシロモノじゃなくなったな CUDAてなんで3次元でスレッド管理するの?
DRAMが実装構造としては2次元でもアドレスでコーダがrow. columnは吸収して1次元で管理するように
スレッドもそうしちゃ駄目な理由を知りたい。
そもそも、3次元ってのとgrid, blockがなんの関係もないんじゃないの?
2次元を block として管理して
3次元の奥行が必要になった時点でgridが登場するならまだ理解できるんだけど。
しかも
threads/block = 1024 と少ない。こんなんじゃ32x32行列越えたら一挙にメンドクサイ 3DCG処理やる場合、最初から3次元のID貰った方が楽じゃん? block,grid へのスレッドの割当て方とかでパフォーマンス変わりますか?
1000個のスレッドを起動したいとき、
block内だけで起動する方が速いのかいのか?
それとも
10個/grid, 100個/blockと分ける方が速いのか?
OpenCLでNVidiaがAMDほどパフォーマンスが上がらないのはスレッドの立ち上げかたで
癖のようなものがあるからってのはないですか?
block,gridってパーティションは単にソフトの問題なのかハード上の制約でこうしてるのかが知りたい 変わるけど、今のGPUそんなん意識しなくても速いからいいだろ
Keplerまでは色々考えないと速くならんかったけど、Maxwell以降はそんな考えなくてもよくなったからおけ なるほど
じゃblockとかgridとかのパーティションはその時々作成するアプリ側の都合で
作りやすいように自由に設定していいってことですね?
OpwnCL使うとCUDAより大分速度低下する理由は何ですかね?
AMDはOpenCLしかないけどNVidiaでCUDAで書いたのと遜色ないぐらいのベンチマーク出してるサイトがあったんですが。
単にNvidiaがOpenCLやる気ないだけ? 昔ウチで試したときは同じGPUでCUDAとOpenCLはそんなに差は無かったがなぁ。
ものによってはOpenCLの方が速い場合もあったり。
そんなに差が出るのはバリバリにチューニングしたCUDAカーネルをOpenCLにベタ移植したとかかねぇ? 厳密には、ハードウェアを意識するならちゃんと考えたほうがいい
あと適当に言ったけどさすがに今の世代でも1スレッドブロックしか立ち上げないとかだとめっちゃ遅いと思う
GPUの並列性を埋めるなら、1SMに対して複数のスレッドブロックを当てられるぐらいであり、全SMに対してそれができるぐらい、つまり数万スレッドを立ち上げた方がいい
とはいえレジスタ数との兼ね合いもあるからそこはバランスを見て OpenCLとCUDAに本質的な速度の差はないよ。最適化がどれぐらいかかるかの違いじゃない?
一般的な使い方をするならOpenCLはオンラインコンパイルだからあんま最適化かからんけど、CUDAなら最適化がかかるとかそういう感じ nVIDIAがCLやる気ないのはわかりきってることだろうに 一般にはオンラインコンパイラの方がその環境に合わせた最適化ができると思うがな。
NVIDIAがどこまでやってくれているかは知らないがIntel OpenCLは頑張っていた印象。 nVIDIAはclCreateProgramWithIL無いんだったなw 今度のゲフォ fp64で
ラデなみの速度でるとか情報ないの? 11.7 にしたらoptix のdirect callがこわれた 今月のIF誌GPUプログラム特集ですなー
AMDも含むけど
最近のIF誌Pythonとラスパイばっかでうんざりしてた IF誌読んだけど、
中級以上のCUSAプログラマ諸氏にはなんの価値もないです
意識してコーディングするとたちまち複雑化するシェアードメモリになんらかの言及があると思ったのですが、
サンプルプログラムはシェアードメモリで速度かせいでます。
だけでした
そんな解説なら俺でも出来るわ >>246
初級の私には役立ちそうですね‥‥ぽち‥‥ と思うなら読んでみればいいよ
Nvidiaのプログラミングガイド以上の情報あったら教えて >>246
読んでねえしCUDA知らんけど、書くにしても
チャネルコンフリクトを避けるように書きましょう!
たとえばこうやってずれるように・・・
って程度じゃねえかなあ cudaはグラボ2枚差し使えますか?
コンシューマ向きのグラボだとvramが24Gですが
48Gになれば購入したいです。
そもそもvram24Gもってる人でどんな処理をしてるのか
知りたいです。例えば深層学習で〇時間を▽というグラボで
こんだけ時間がかかるとか。
そういうデータがほしいです!
よろしく! >>252
A6000 (48GB) 使ってるけど pix2pix とかやったら画像1000枚でも数日かかるよ。
vgg16 とか mobilenet で数時間の学習が多いけど、画像集めるのに一週間かかる。 積分する関数をCUDAで書こうと思っています
リストのIntegrateのように関数テンプレートにすることで,
通常のC++であれば
呼び出し時に
被積分関数(ここではSinc)として
関数へのポインタでも,
ラムダ式でも
直接関数名を書いてもうまく動作させることができるのですが,
CUDAではうまくいかないようです.
もちろんIntegrateの中で被積分関数を直接記述すれば問題なく動作するのですが,
これだと毎回エディタでIntegrateの修正が必要になってきます.
呼び出し時の引数として被積分関数を与えるにはどーすればいいんでしょうか? プログラム リストです
__global__
void
//__device__
//float
Sinc() {
printf("Ahyahya\n");
//return start;
}
template< typename Functor>
__global__
void
Integrate(Functor func){
func <<<1, 1024>>> ();
//Sinc << <1, 1024 >> > ();
__syncthreads();
}
int
main() {
Integrate <<<1, 1>>> (0, 10, Sinc);
//Sinc << <1, 1024 >> > ();
} main 中
誤 Integrate <<<1, 1>>> (0, 10, Sinc);
正 Integrate <<<1, 1>>> ( Sinc );
プログラムリストのコピペ時 0,10, を消すの忘れてました すまんが、MacやdGPUのないWindowsノートでコード書けたらいいなと思うんだけどさ
CUDAを扱えるオンラインIDEとかエミュレーターとかなんかないもんなのかな? >>256
最近CUDA使ってないから間違ってるかもしれんが、__global__がついた関数からは__device__しか呼べなかったきがする。__global__関数から__global__が呼べるかちゃんとマニュアルで確認しよう。 >>258
google colaboratoryのGPUインスタンスで昔ちょっとしたCudaのコードを動かしたことはある。
基本はpythonで動かすことが前提なのでちょっと面倒なことしないとCのコードは動かせなかった。
後有料アカウントしないとGPUインスタンスに制限時間がつくかも。 >>259
いや__global__から__global__を呼ぶことは何も問題ない
>>256のリストにある関数Integrateの中でコメントアウトしてる部分がそれ,
直接呼ぶのは何も問題ないのに, ファンクタとして間接的に呼べないんで困ってる せんきゅー!
Colaboratoryは怪しいことをしてると警告が出てビビっちゃうし、AWSは高いし、コードを書く時点で契約するには勇気がいるな・・・・ >>264
Linux使うのでもよかったら一万円ぐらいのjetson nano買えばCuda使えるよ んなもん使うぐらいならふつーにx64でコード書いたほうがよっぽどいい
エンベ用途でもないのに何を好んでわざわざワンボードマイコンで計算せにゃならんのだ >>266
小さいものを愛でる気持ちがないのかな?
お金が掛からないしGPIO使えるし。
GPUの性能が今売ってるGPUよりかだいぶ低いけど。
普通のPCからクロスコンパイルもできるらしいよ。 文脈から想像するに>>264はCPUよりGPU計算が速いことを期待して
ノートからGPUを使ってみたいんだろうよ
それを単にCUDAが乗ってるだけでx64のマルチコアに遠く及ばないワンボードマイコンごときのGPUを何のためにわざわざ使う必要があるんだ?
組込用途とかでこれまでFPGA起こしたりASIC起こしたりしてた部分で
ワンボードマイコンのGPUが代わることもあるだろう.
実際、産業機械にRasPiをまんま組込む用途も増えてる
しかし、どーかんがえてもそっち系じゃない>>264にワンボードマイコンすすめてどーすんだって話 コードを手元で書いて、実際に計算する際は実機を用意するかAWSを借りるつもりでいます
ただコードを書くだけの段階でAWSを借りると負担なので、何かいい方法があればいいなと思った次第です >>270
https://www.%61mazon.co.jp/dp/B085TH77RT
カードに安いやつかっても10万円コース
AWSなくてもいけるが電気代要るわな
それとThunderboltがボトルネックになることはほぼ確定 sharedメモリは
https://zukaaax.com/archives/530
ここの最後に書いてる
>シェアードメモリを使用しなくても高速にできるようにする方針
これホント? Dynamic Parallelism で親スレッドと子スレッドの属するブロックを
同一ブロックに属するような指定はできますか?
同一ブロックにして親スレッドが確保したShared Memory を子スレッドからアクセスしたいんだですが. 訂正です
○同一ブロックにして親スレッドが確保したShared Memory を親スレッドからアクセスしたいんですが.
myKernel<<<gridSize, blockSize, nI*sizeof(int))>>>(...);
親スレッドで確保して子スレッドに引き渡すnI*sizeof(int)サイズのshared memoryですが
この領域を親スレッドからアクセスできないんでしょーか? 事故レスです
そもそも親子スレッド間でグローバルメモリのローカル変数の参照渡しが無理らしい
ローカル変数なんかやめにして、大域変数にして__device__つけろとorz
当然のごとくshared memoryもだめっぽい
C++でUser I/Fを使いやすく仕上げたいと思ってたけど
そーゆーおしゃれなことは
いろんな制限が頭に入っるまでは素直にゴリゴリCで書いてたほうがよさそう __global__のなかでnew,delete使えるので
もしやと思ってmake_unique使おうとしたらだめだった make_unique以前にstd::unique_ptrの時点でだめだったわ
cudaMalloc使ったunique_ptrバージョンはネットで公開してる人いるのめっけた
https://proc-cpuinfo.fixstars.com/2019/02/cuda_smart_pointer/
host側からgpuメモリ確保したいならコレでいいけど
__global__の中で使うmalloc,freeはGPUメモリを使うバージョンが正しくリンクされるので
malloc, free使って各関数は__device__指定すれば,
cuda::unique_ptrで正しく使えるのかな? cudaMallocやcudaFreeってのはホスト側からGPUとのインターフェース用として
プログラムの中で1度呼ぶだけなんだよね
GPUへの初期設定メモリ inmem
GPUの計算結果 outmem
として
ホスト側で
kernel<<<1,1>>>(inmem, outmem);
を立ち上げる際 この前後でcudaMalloc, cudaMemcpy, cudaFreeを使うだけ
kernel関数で一旦制御をGP側に移したあと
おもむろにDynamic Parallelism を使ってkernel関数の中からマルチスレッドを起動する方がよっぽど書きやすい
new/deleteは__global__関数のなかで自由に使えるので
cudaMalloc/cudaFreeにuniqu_ptr使えてもあんま有り難みは少ないな 質問です。
cpuは64コア、gpuは年末のvram48ギガ2つ、メモリはddr5 256g
これ以上は経済的事情により無理ですw
vram48ギガ二つで深層学習したいんですけど
どの規模でどのくらいのデータ処理ができますか?
マルチcudaで処理速度はどれくらい高速化できますか?
CUDA Python (Numba) を使用して気象分析の分野で 200,000 倍高速化する
こういう記事がありました。
このようなデータがありましたが20万倍以上の高速化ってできますか?
きになります。もしグラボがvram48一つと二つで差がなければ
vram一つにしたいと思います。 >>279
VRAM48Gもあれば、相当の大きさのモデルでも、バッチサイズある程度取れると思う。
2枚にするなら、NVLINKやったかのボード間通信できるやつやらないと、
同時に使ってバッチサイズ倍にするぜってやつが遅い。
一枚でもいいんでない?って気はする。
何と比較して速くしたいのか分からんけど、3090ti(24GBメモリ)1枚でも普通のモデルなら
ちゃんと学習できる。長いと数日学習に時間がかかるけど。
爆速学習したいなら、クラウドで大富豪するしかないぞ。
具体的に動かしたいモデルとかあるの? >>282
返信サンキュー!情報ありがとさん!!
気象予測がしたくて(とある記事に20万倍の高速化と書いてあった)
クラウドいいですね〜!
どうしてもpythonのnumbaがやりたくて!
ちなみにpycharmかgoogle coalb pro plusはどちらが良いのでしょうか? >>254
cudaつかっても1週間もかかるんですか? 気象予測て流体力学だろ
学習とかの前に基礎方程式がわかってるものは
粒子フィルタで検討したほうがいいんじゃないの?
もっぱら線形微分方程式に使われるカルマンフィルタを拡張した
アンサンブルカルマンフィルタで見たことあるけど
今だと線形非線形にかかわらず利用可能な粒子フィルタに頼るほうが簡単だと思うけど RTX 4090 Ti
48GB
GDDR6X
これ買う人いますか? >>289
その辺のが一般化してきたら
albertを使った実装例とかがもっと増えるか
ま、もっと高性能なのがクラウドに多数デプロイされそうだけど RTX 4090 Tiを複数差せばおもしろそうやん? 600WのTBPで動作すると予想されます。
だそう。つまり3枚差せば1800wですね。
つまり電源ユニットを2枚で4000ワット以上必要ですね。
電源ユニットが3000wとか4000wとかでないのかな?
困るよね。 .cuファイルで何とか普通のメモリと
GPUのVRAMを同居させて使えるなら
容量の大き過ぎる計算でもスピードは落ちるが
普通のCPUだけの時より速く計算できる、
とか出来たらいいんだけど、まず無理なんだろうなあ
(沖電気はそういうのを上手くやったらしいが詳細が分からない) 何を問題視してるのかよくわからんけど
例えばmkl入れるとかじゃ駄目なのか? >>294
LinuxならUnifiedMemoryでできるな。 ホスト側のメモリをピンして使うことはできるけど多分そういう用途ではないよなあ >>294が言ってるのはOversubscriptionだろ。 C#でCUDAを使おうとして悪戦苦闘してようやくこのスレにたどり着いたのだが・・・
GPUで計算した結果をCPUに取り出すには結局どうやったらいいんだ?
検索してもサンプルプログラムはほとんど出てこないし、GPU動かして終わりでその結果を使うやり方が示されてない。
教えろくださいお願いしますだ CUDAでdll作成してC#に読み込ませる
こんだけ >>268
C言語で普通にCuda使うときだったら、GPU側にメモリ確保してGPUで計算した結果をそこに書き込む。
GPUでの計算が終わったらGPU側のメモリをCPU側のメモリにコピーするみたいな感じだ。
後unified memoryとかいうのでGPUから直接CPU側のメモリに書き込めるらしい。
C言語だったらCUDA sdkにサンプルコードがたくさん入ってるだけどね。
どういう関数使えばいいかはCUDAのドキュメントをちゃんと読めば見つけられるでしょう。