【GPGPU】くだすれCUDAスレ part8【NVIDIA】 [無断転載禁止]©2ch.net (407レス)
【GPGPU】くだすれCUDAスレ part8【NVIDIA】 [無断転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1465969275/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
374: デフォルトの名無しさん [sage] 2023/06/10(土) 08:16:47.35 ID:gJM3u8Zc cudaDeviceSynchronizeはこんなときに使う. Ki=1024, Mi = Ki*Ki, Gi = Ki*Miとでもして __global__ void cuda_main(){ double *idata = new [Mi]; double *odata1 = new [Mi]; double *odata2 = new [Mi]; body1<<< Ki, Ki >>> ( idata, odata1 ); //マルチスレッド実体 cudaDeviceSynchronize(); body2<<< Ki, Ki >>> ( odata1, odara2 ); //マルチスレッド実体 cudaDeviceSynchronize(); for( int i = 0; i < Mi; i++ ){ cudaDeviceSynchronize(); // *** こいつは毎回要ったと思う printf(" %d %e\n", i, odata2[i]); //計算結果表示 } cudaDeviceSynchronize(); // 上の***だけで こいつはなくても構わなかったと思う delete[] odata2; delete[] odata1; delete[] idata; } main(){ //cuda 内newで確保するメモリが8MBを超える場合は設定要 cudaDeviceSetLimit(cudaLimitMallocHeapSize, size_t(Gi + Gi)); //printf fifoを16Miにしてみた cudaDeviceSetLimit(cudaLimitPrintfFifoSize, 16 * Mi); cuda_main<<<1、1>>>(); } http://mevius.5ch.net/test/read.cgi/tech/1465969275/374
375: デフォルトの名無しさん [sage] 2023/06/10(土) 08:17:55.93 ID:gJM3u8Zc つづき ホスト側からcuda用のエントリポイント cuda_main()を一つ起動して そこで計算に必要なgpuメモリをnew/mallocで確保 delete/freeもしくはデストラクタでメモリ解放してほとんどふつーのC++プログラム作成 エントリポイントとなるcuda_mainスレッドを一つ起動するだけでほぼgpu側だけで閉じたふつーのc++コードになる gpuが計算した結果をどー出力するか?ってのはあるんだが、 __global__関数内のprintfが標準出力にちゃーんと出力してくれる つまり、 リダイレクトでファイルに落とせる コマンドラインから > cuda_program.exe >> file.dat て感じ http://mevius.5ch.net/test/read.cgi/tech/1465969275/375
376: デフォルトの名無しさん [sage] 2023/06/10(土) 08:20:34.56 ID:gJM3u8Zc つづき こういうコードスタイルにすることでcudamallocで確保するgpuメモリはホスト<->gpuのインターフェースに使う最低限のメモリに限定することができて コーディングが格段に楽になる ほぼふつーのC++プログラムと変わらん この書き方で問題なのは__global__内でunique_ptrが使えないことなんだが、 数値計算でunique_ptr使えなくて困る場合ってどんな場合か逆に聞きたいわ. それより ホスト側でgpu内部処理にしか使わないメモリまで確保して、そいつをcuda::unique_ptrなんか作って管理するよりよほど楽だと思うが? こういうのはディレクトリの外からディレクトリ操作するのに似た感覚でとても耐えられんし、 cuda Dynamic Parallelismと__global__関数内でnew/deleteを書けるようになってるお陰でふつーのC++コードが書けるようになってるんだわ. んで肝心の cudaDeviceSynchronize() だが マルチスレッド実態は body1、 body2だがbody2の実行と計算結果odata2の表示はbody1とbody2の計算完了が前提としてる それらの待ち合わせ処理としてを使うんだが、 ここで cudaDeviceSynchronize() がないと dynamic Parallelismがあっても上のようなコードは書けない http://mevius.5ch.net/test/read.cgi/tech/1465969275/376
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.024s