- 1 :デフォルトの名無しさん:2011/08/23(火) 22:08:06.09
- このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
CUDA使いが優しくコメントを返しますが、
お礼はCUDAの布教と初心者の救済をお願いします。
CUDA・HomePage
http://developer.nvidia.com/category/zone/cuda-zone
関連スレ
GPGPU#5
http://hibari.2ch.net/test/read.cgi/tech/1281876470/
前スレ
【GPGPU】くだすれCUDAスレ【NVIDIA】
http://pc12.2ch.net/test/read.cgi/tech/1206152032/
【GPGPU】くだすれCUDAスレ pert2【NVIDIA】
http://pc12.2ch.net/test/read.cgi/tech/1254997777/
【GPGPU】くだすれCUDAスレ pert3【NVIDIA】
http://hibari.2ch.net/test/read.cgi/tech/1271587710/
【GPGPU】くだすれCUDAスレ pert4【NVIDIA】
http://hibari.2ch.net/test/read.cgi/tech/1291467433/ - 159 :デフォルトの名無しさん:2011/11/27(日) 22:05:36.51
- 全スレッドの計算結果を1コアに集約して1スレッドで処理したいんだけどいい方法あるかな?
リダクションのサンプルだと最後はCPUで合計だしこれでは都合悪いんだよね
全てGPUでやりたいのよね - 195 :デフォルトの名無しさん:2011/12/07(水) 00:45:36.69
- +=で同じアドレスに同時書き込みしてるから
- 197 :デフォルトの名無しさん:2011/12/07(水) 01:27:31.21
- 競合状態が発生してんじゃないの?
atomic演算とか同期が必要だと思うよ。
512スレッドで同一アドレスの変数の読み書きしてんだから。
まず512個の要素の配列作って、添え字にスレッド番号(上のi)を指定して確認してみたら?
書籍ならcuda exampleも買って読むといいかもね - 198 :デフォルトの名無しさん:2011/12/07(水) 02:05:18.21
- >>197
>競合状態が発生してんじゃないの?
>>195のコメと合わせて考えるに、なんとなく予想はしてましたけど、取り合いになってるんですね...
>atomic演算とか同期が必要だと思うよ。
まだザックリとしか勉強してないので、atomic演算は知らなかったです。あとで試してみます。
同期を行う場合だったら、どうすればいいのだろう。
>まず512個の要素の配列作って、添え字にスレッド番号(上のi)を指定して確認してみたら?
それは分岐条件がきちんと実行しているのか見るためのテストをしたとき確認しました。 - 274 :デフォルトの名無しさん:2012/01/06(金) 20:14:34.67
- 環境
Windows7 Professional 64bit
Microsoft Visual C++ 2010 Express Version 10.0.40219.1
Microsoft .NET Framwork Version 4.0.30319
GeForce GTX 580
CUDA Toolkit 4.0.17
SDK 4.0.19
devdriver_4.0_winvista-win7_64_270.81_general
この(ピヨピヨ)を参考に環境を構築しました。
http://feather.cocolog-nifty.com/weblog/2011/07/visual-studio-2.html
そして以下のサイトのサンプルプログラムを実行してみました。
http://www.gdep.jp/page/view/218
Hello,Worldと99 bottles of beerはcpu、gpu共に実行できました。
しかし、Matrixのプログラムはcpuの方は実行できるのですがgpuの方が実行できません。
以下のエラーを吐きます。
matrix_gpu.cu(5) : fatal error C1083: Cannot open include file: 'cutil_inline.h'
: No such file or directory
どうやらVisualStudioのパスがうまく通ってないということまでわかり、以下のサイトなどを参考にCUDA_INC_PATHなどを変えてみましたが、一向に変わりません。
http://d.hatena.ne.jp/Levi/20090921/1253535802#c
SDK内のcutil_inline.h自体をtoolkitのincフォルダにコピペすると、他の.hファイルもいくつか同じエラーが出たのでエラーになったものをすべてコピペしたところ、LNK2019"link.exe"というエラーで先に進めませんでした。
一度VisualStudioを再インストールしてみましたが、状況は変わりません。
Nvidia GPU computing SDK Browserではサンプルプログラムを実行できているので、CUDAの環境は整っていると思われます。
どうすれば解決できますでしょうか・・・。かれこれ1週間以上格闘しています。
VisualStudioは2010よりも2008にした方がいいでしょうか? - 275 :デフォルトの名無しさん:2012/01/06(金) 20:23:04.24
- C初心者にはきついと思うんだが…
とりあえず 'cutil_inline.h'のある場所を見つけて
そこを-I /'cutil_inline.hのある場所'と指定する
意味わからなければCのコンパイルを勉強すること - 292 :デフォルトの名無しさん:2012/01/09(月) 18:01:50.03
- >>275
274です。
-Iオプションを付けてヘッダファイルのある場所を指定してみましたが、相変わらず同じエラーです。
C:\cuda_practice\test>nvcc -o matrix_gpu.exe matrix_gpu.cu -I C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common\inc
matrix_gpu.cu
matrix_gpu.cu(5) : fatal error C1083: Cannot open include file: 'cutil_inline.h': No such file or directory
自分でも試行錯誤してみますが周りにcudaがわかる人がいなくて行き詰ってます・・・。 - 298 :デフォルトの名無しさん:2012/01/10(火) 17:15:02.61
- sharedメモリって同一WARP内でのやり取りだったら同期なしで大丈夫なのでしょうか?
たとえば全部で32スレッドで次のkernelを実行した場合、
WARP内で一斉にsharedメモリに書きに行くので同期しないで大丈夫かと
思ったのですが、実際にはうまくいきません。
globalメモリに読みに行く段階でコアレッシングが発生していないので
それが原因なのでしょうか?
どなたか教えてください。
__global__ void kernel(float *g_v, float *g_x){
float x = 0.0f;
int i = blockDim.x * blockIdx.x + threadIdx.x;
__shared__ float s_v[32];
s_v[i] = g_v[i+i%3];
__syncthreads(); // これが必要かどうか?
x = s_v[(i+3)%32];
g_x[i] = x;
} - 299 :デフォルトの名無しさん:2012/01/10(火) 17:35:07.81
- >>292
参照パスを ""で囲む♪ - 355 :デフォルトの名無しさん:2012/01/24(火) 19:53:55.48
- コンパイル時に以下のエラーメッセージが出ているのですが、
ptxas error : Entry function '...' uses too much local data (0x16054 bytes, 0x4000 max)
これはローカルメモリーと何か関係あるような気がするのですけど、
ちょっとわからないので教えて頂けないでしょうか。
宜しくお願いします。 - 357 :デフォルトの名無しさん:2012/01/24(火) 21:56:32.01
- > ptxas error : Entry function '...' uses too much local data (0x16054 bytes, 0x4000 max)
単に配列の次元が大きすぎるのでは?
最大 0x4000バイトのところを0x16054 bytes使おうとしている?
> ホスト・デバイスともに共有させたい場合はどうしたらいいのでしょうか?
物理的に無理でないの?
ホスト←→デバイス間でコピーしないといけないのでは?? - 358 :デフォルトの名無しさん:2012/01/24(火) 21:56:54.10
- >>355
メッセージそのままの意味だろ。 - 362 :355,356:2012/01/25(水) 15:21:00.98
- >>358
青木氏の「はじめてのCUDA」に似たようなエラーメッセージが載ってるのですが、
local dataがどの部分の話なのか、ちょっとわからない状態でして...
>>357
>単に配列の次元が大きすぎるのでは?
予定だと1×256スレッドしか使うので、足りないはずないような... 意味が違うか。
ちょっとわからないので詳細お願いします。
>ヘッダーファイルに
>#DEFINE
>などで定義して、ホストとデバイスのプログラムに そのヘッダーファイルをinclude する手があった♪
ちょっと試してみます。それができなかったら、コピーするしかないかもしれません。
__device__ extern TEST test;
のような宣言してて、実行ファイルができたときがあったのですが、何か違うよな、と引っかかってたので、
ここで質問しました。ありがとうございます。 - 363 :デフォルトの名無しさん:2012/01/25(水) 17:40:16.56
- 差し支えなければプログラムをアップしてくださいませ♪
- 364 :デフォルトの名無しさん:2012/01/25(水) 18:01:06.82
- >>362
この(ピヨピヨ)の一番下にある資料の3-41ページにそのエラーメッセージが載っている模様。
http://accc.riken.jp/HPC/training.html - 365 :355,356:2012/01/25(水) 18:04:09.31
- >>362です。
>>363
申し訳ないのですが、プログラムのアップは出来ないです。すみません。
なんかもう分からなくなったので、ホストとデバイスの住み分けを行ったところ、
「ptxas error...」云々のメッセージが消え、コンパイルできました。
(さっきまでhost,device,global宣言関数がごちゃ混ぜな状態だった。)
何が原因だったのか分からず仕舞いです。
グローバル変数の共有はとりあえず、コンスタントメモリにデータコピーで様子見することにしました。
元コード(.c)をもう一度読み直したところ、デバイス側の方はReadOnlyで十分なようでしたから。
皆様回答ありがとうございました。またよろしくお願いします。 - 366 :365:2012/01/25(水) 21:05:50.75
- >>364
資料ありがとうございます。
うまくいったと思った途端、また同じエラーが出てきてしまったので、確認します。
.cファイルに.cuファイルを組み込ませるようにしたら、
__host__ __device__で修飾した関数が定義されてないと.cファイル側に言われ、
.cファイルと.cuファイルそれぞれ単独で動かせるようにしたら、
(同じ内容の関数を.cと.cuそれぞれ別名で実体作った。.c:test .cu:ktestみたいな)
今度はさっきと同じエラー。
実行ファイル作るだけなのに難しい... - 368 :デフォルトの名無しさん:2012/01/26(木) 08:53:13.45
- 取り敢えずCudaのサンプルは捨てて、インクルード関係とオブジェクトの生成手順を確認するんだ。
- 370 :366:2012/01/26(木) 16:19:08.01
- >>368
>取り敢えずCudaのサンプルは捨てて、インクルード関係とオブジェクトの生成手順を確認するんだ。
のように手順を踏んでコンパイルしたところ、実行ファイルができました。
皆様ありがとうございました。 - 371 :370:2012/01/26(木) 20:33:24.55
- お恥ずかしながら、また戻ってきました。
あれからセグメンテーション違反が出てきてしまったので、あれこれ探していた結果、
どうやらデバイスのメモリ確保&送信に失敗していたようです。
しかし解せないことがあって、
構造体A a,構造体B b[100],構造体C c[100],...(以下略 をデバイス側に送るのですが、
(1つ1つのサイズは結構大きめ。グローバルは1GBあって余裕で確保出きるハズ...)
void main(){
・・・
test(&a,b,c....);
}
void test(A *a,B *b,C *c...){
A *d_a; B *d_b; C *d_c;
CUT_SAFE_CALL(cudaMalloc((void**)&d_a,sizeof(A)));
CUT_SAFE_CALL(cudaMemcpy(d_a,a,sizeof(A),cudaMemcpyHtoD));
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)*100));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B)*100,cudaMemcpyHtoD));
・・・
}
はじめてcuda,cuda_by_exampleで確認したところ、
文法的ミスはないはずなのに確保ミスしてるらしく、中断してます。
この原因は一体全体なんなんでしょうか。 - 372 :デフォルトの名無しさん:2012/01/26(木) 21:28:56.32
- 4.1正式版
CUDA Toolkit 4.1 | NVIDIA Developer Zone
http://developer.nvidia.com/cuda-toolkit-41 - 373 :デフォルトの名無しさん:2012/01/26(木) 21:55:28.42
- 構造体の中身がよく分からんが,allocateのところで *100は必要なのかな?
構造体Bのメモリーを100個分用意しようとしている??
構造体Bの中にすでに [100]個の配列を取っているのに???
数は合っておるのか???? - 375 :デフォルトの名無しさん:2012/01/27(金) 00:03:32.49
- >>372
遂にRC取れたか!4.0からどう変わってるか知らんけど。
Kepler向けのプログラムを作れるのは5.0とかになるんだろうか。
そしてそれはいつ出るんだろう。
>>371
1GBのVRAM積んでるカードでも400MBぐらいの確保で失敗したことがあったような覚えがある。
確保するサイズを小さくしてもエラーが出るってんならこの話は忘れてくれ。 - 383 :371:2012/01/27(金) 18:15:48.81
- >>373
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)*100));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B)*100,cudaMemcpyHtoD));
これはミスですね....
正しくは
CUT_SAFE_CALL(cudaMalloc((void**)&d_b,sizeof(B)));
CUT_SAFE_CALL(cudaMemcpy(d_a,b,sizeof(B),cudaMemcpyHtoD));
です。すみません。
>>375
4000MBの領域確保でも失敗することがあったんですか...
ちょっと試してみます。 - 387 :383:2012/01/28(土) 17:54:35.37
- >>371
なんかサンプルがめちゃくちゃなんで書き直します。 - 388 :387:2012/01/28(土) 20:55:21.49
- 確認なのですけど、カーネル関数の引数はポインタ限定ですか?
- 671 :デフォルトの名無しさん:2012/04/29(日) 14:44:53.67
- GPUのデメリットは同じ変数計算を毎回糞真面目に超高速で行うところ
- 719 :デフォルトの名無しさん:2012/05/17(木) 21:52:07.76
- 多次元配列を扱えないのは何でなんだろう.
ブロックとスレッドインデックスで一次元化するの面倒なんだけど. - 737 :デフォルトの名無しさん:2012/05/23(水) 14:44:51.35
- 詳しい方に質問させてください。
Win7Pro64 + VC2010Pro + CUDA4.2で32bitのdll (Matlabのmex)を
作成して、カーネル(1回のみ呼び出し)の実行時間を計測しました。
Nsight Visual Studio Editionのプロファイルでは約3583msとなったのですが、
メイン関数側でカーネル呼び出しの時間を調べると12079msとなりました。
この差の原因がわからずに困っているのですが、心当たりのある方は
いらっしゃいませんか?
足りない情報などあればツッコんでください。
よろしくお願いします。 - 738 :デフォルトの名無しさん:2012/05/23(水) 15:16:21.45
- >>737
詳細は実際のコードを見ないと判らないけれど、カーネル呼び出しは完了復帰じゃないよ。
逆に、それを巧く利用すればGPUとCPUで並列処理ができるって寸法だ。 - 739 :737:2012/05/23(水) 15:25:51.83
- >>738
レスありがとうございます。
メイン関数側での測定は、カーネル呼び出し後に
cudaThreadSynchronize();
としてから測定していますが、これではダメですか?
これを入れ忘れると、メイン関数側での測定時間が極端に短くなる
という話はよく目にするのですが、今回は逆に、メイン関数側での
測定時間が極端に長くなっています・・・・ - 758 :デフォルトの名無しさん:2012/06/02(土) 02:34:05.01
- CUDAで計算した結果をDirect3Dで描画したいんですが、
同じプログラム内で同時に使っても問題ないでしょうか?
一つのGPUがCUDAとDirect3Dを切り替えて使うので、
切替のオーバーヘッドとか大きかったりするんでしょうか?? - 777 :デフォルトの名無しさん:2012/06/08(金) 14:37:45.13
- カーネル関数で乱数使いたいとき、みんなどのライブラリを使ってるの?
curandとtinymtは使ったことがあるんだけど、他におすすめある? - 829 :デフォルトの名無しさん:2012/08/02(木) 16:58:06.96
- 最近CUDAの勉強を始めて、試しに画像処理アプリをGPU用に書き換えているのですが
どうしても分からないことがあるので質問させてください
double *a[5],*d_a[5];
int size=1280*1024; //実際には読み込んだ画像のサイズが入ります
for(i=0;i<5;i++){
a[i]=(double *)calloc(size,sizeof(double));
for(j=0;j<size;j++)a[i][j]=i*j; //ここのi*jは実際には読み込んだ画像の画素情報が入ります
}
for(i=0;i<5;i++)cudaMalloc((void**)&d_a[i],sizeof(double)*size);
for(i=0;i<5;i++)cudaMemcpy(d_a[i],a[i],sizeof(double)*size,cudaMemcpyHostToDevice);
func<<< Dg, Db >>>(d_a);
__global__ void func(double *f_a[5]);
上記のf_a[5]の、ホストにおけるa[i][j]にあたる値を参照するにはどうしたらよいでしょうか
ホスト同様にf_a[i][j]とすると
Warning: Cannot tell what pointer points to, assuming global memory space
上記の警告が出て上手くいきません
超初歩的な質問かと思いますが、アドバイス宜しくお願いします - 830 :デフォルトの名無しさん:2012/08/02(木) 17:15:58.20
- >>829
d_aはホスト上の配列。そいつへのポインタを渡してもなんともならない。
d_aが固定長でいいなら、__global__ void func(doule * f_a0, doule * f_a1, doule * f_a2, doule * f_a3, doule * f_a4);
とするのが手っ取り早い。
d_aが可変長だったり巨大だったりするなら、
double ** dPtrArray, ** hPtrArray;
hPtrArray = malloc(sizeof(* hPtrArray) * length);
cudaMalloc((void **) & dPtrArray, sizeof(* dPtrArray) * length);
for (int ic = 0; ic < length; ++ic) {
cudaMalloc((void **) & hPtrArray[ic], sizeof(* tmp) * size);
cudaMemcpy(hPtrArray[ic], a[ic], sizeof(double) * size, cudaMemcpyHostToDevice);
}
cudaMemcpy(dPtrArray, hPtrArray, sizeof(* hPtrArray) * length, cudaMemcpyHostToDevice);
とでもしないと。 - 853 :デフォルトの名無しさん:2012/08/06(月) 23:15:24.01
- C++とCUDAを連携させたプログラムを作成しているのですが、どうしても解決出来ない問題が発生してしまったので教えて下さい。
C++のスレに質問するか迷ったのですが、エラーにはCUDAがメインで関わっていると思ったのでこちらに書き込みます。
C++のプログラムからCUDAのプログラム(既にexeになっているもの)を実行したいと思い、下記のようなプログラムを作成したのですが、
CUDAプログラム単体では動いているのにC++のプログラムから呼び出すと実行時にエラーが発生してしまいます。
SDK内のサンプルプログラムでも実行エラーになってしまうので、CUDAプログラム側のバグでは無いと思うのですが…
system関数では実行出来ないのでしょうか?system関数以外でも良いのでなんとか実行する方法が知りたいです。
int _tmain(int argc, _TCHAR* argv[])
{
int ret;
printf("CUDAプログラム実行開始\n");
ret = system("\"D:\\Program File\\Test_Print.exe\"");
if(ret == 0)
{
printf("プログラム実行成功\n");
}
else
{
printf("プログラム実行失敗\n");
}
} - 854 :デフォルトの名無しさん:2012/08/06(月) 23:54:55.12
- そのTest_Print.exeと同じ場所に何でもいいのでC++で作った何か*.exeを置いて同じことを試してみなよ。
俺があてずっぽうで言うとたぶん同じようにうまくいかないつまりCUDAがどうこうって問題じゃない。 - 857 :デフォルトの名無しさん:2012/08/07(火) 03:43:55.76
- >>853
system関数のマニュアル見てエラーの値をしらべたら? - 869 :デフォルトの名無しさん:2012/08/11(土) 20:06:38.41
- 超基本的な質問をしたい。
「はじめてのCUDAプログラミング」を読んで色々動かしてるんだが、
ブロックとスレッドとSMとSPのそれぞれ関係がいまいちモヤッとしてる。
最初から順に読んでいて、57 ページの次の説明で躓いた。
> スレッド当たりのレジスタ数が
> 「SM当たりのレジスタ数 / ブロック内のスレッド数」
より多い時は、「カーネル関数」を実行できなくなります。
SM や レジスタは物理的なもので、ブロックやスレッドは論理的なものなのに、
なんでごちゃ混ぜになってるのか・・・
その少し後のページも見たり、直前の Warp の説明を読んで
俺なりに考えた結果、次のような認識なのだが、これは間違ってる?
・1つの SP は一度に1つのスレッドを処理する
・1つの SM は一度に1つのブロックを処理する
http://toro.2ch.net/test/read.cgi/tech/1314104886/l50/../人気ブログランキングへ