2012-03-01 7 views
0

フロートの配列を更新したCUDAコードを実行しました。私はHow can I compile CUDA code then link it to a C++ project?で議論されたようなラッパー関数を持っています。私のCUDA関数内CUDAコード内のループ

私は...

int tid = threadIdx.x; 
for(int i=0;i<X;i++) 
{ 
    //code here 
} 

このようなループのために作成今問題Xが100の値に等しい場合、すべてがうまく動作しますが、Xが等しいかどうかということです〜1000000、私のベクトルは更新されません(ほとんどの場合、forループ内のコードが実行されないように)

私はCUDA関数をforループで呼び出すと、今でもうまく動作します(ただし、CPU上で同じプロセスを単純に実行した場合よりも何らかの理由でかなり遅くなります)。

for(int i=0;i<1000000;i++) 
{ 
     update<<<NumObjects,1>>>(dev_a, NumObjects); 
} 

私はラッパー関数で何百万回もループすることができますが、単にCUDAの "更新"関数を呼び出してからその関数内で百万回のループを開始するのは誰にも分かりますか?

+2

[CUDAの上限に達しているようですが、それは何ですか?](http://stackoverflow.com/questions/6913206/cuda-limit-seems-to-be-reached-but-what- limit-is-that) – talonmies

+0

Xの値を大きくすると、カーネルはまったく実行されますか?エラーチェックをしていますか?あなたがすべき。 Xはコンパイル時定数か#defineですか?もしそうなら、適切なコンパイラフラグを使用して、共有された一定のメモリ要件とレジスタ数をチェックしていますか? NVIDIA CUDA Occupancy Calculatorを使用して結果を調べていますか?たくさんのことが起こっている可能性があります。 – Patrick87

+0

ありがとうパトリック... Xは、この投稿の目的のための変数です。私は通常 "x"を "1000000"のようなハードコードされた値に置き換えます。Talonmiesは良い投稿をしています。それが理由です – Matthew

答えて

0

これを実行した後、cudaThreadSynchronizeとcudaGetLastErrorを使用してエラーがあるかどうかを確認する必要があります。私は初めて想像して、タイムアウトしました。これは、カーネルが完了するのに時間がかかる場合に発生します。カードはちょうどそれをあきらめる。

2番目の理由は、実行に時間がかかる理由は、カーネルが起動するたびにオーバーヘッド時間が設定されているためです。カーネルの中にループがあると、このオーバーヘッドが一度経験され、ループが実行されました。今あなたはそれをX回経験しています。オーバーヘッドはかなり小さいですが、できるだけ多くのループをカーネルの中に入れなければなりません。

Xが特に大きい場合は、できるだけ多くのループをカーネル内で実行してから、安全な時間内に完了してからこれらのカーネルをループすることがあります。