2017-06-26 3 views
1

私はすべての研究と読解の後、私はまだこれを行う方法について100%明確ではないので、私は尋ねなければならない私はgpuカード上で実行するために、次のようなものを取得しようとしていると私はCuda Cを生成するCudafy.Netを使用しています。私はこれを可能な限り速く走らせたいと思っています。ネストされたfor-loopsを持つ関数をCudafy.Netに変換する方法

私が機能を持っている場合(簡体字)のような次のように私は起動()関数でこれを呼び出しています

Transform() 
{ 
    for (lgDY = 0; lgDY < lgeHeight; lgDY++) 
    { 
     for (lgDX = 0; lgDX < lgeWidth; lgDX++) 
     { 
      // do a lot of stuff with lgDY and lgDX like stuff a matrix 
     } 
    } 
} 

gpu.Launch(blocksize, threadsize, "Transform", args...) 

私はGThreadとして渡さ精通していますblocksize.x、blockdim.x、およびthreadsize.x、さらにブロックのyとzを指定します。文のため離れて行くと、私は

if (y < lgeHeight) 
    if (x < lgeWidth) 
... 

のような種類のテストに置き換えるしかし、その後どのように「インクリメントlgDYとlgDXに各反復を結ぶには考えている場合、私は苦労の理解を持っています。

私はそれが大変明白であるか、正確に何をしようとしているのか記述していない場合はお詫び申し上げます。入れ子になったループを正しい方法で混乱させるだけです。

答えて

1

lgeHeightとlgeWidthのサイズによって異なりますが、その積がカード上のスレッドよりも小さい場合は、カーネルを起動すると、各スレッドはxとyの1組で実行されると仮定できます。

lgDY = threadIdx.x 
lgDX = blockIdx.x 

次に、すべてを一度に計算できます。製品より多くのスレッドがある場合は、問題をより小さな部分に分割するか、各マトリックスに対して小さな繰り返しを実行する必要があります。

+0

あなたの返信ありがとうございますMilhous。カードには、1024ブロック、最大スレッドサイズ(1024、1024、1)、最大グリッド寸法(2147483647、65535,1)、lgeHeight = 2150、lgeWidth = 4300(9245000)があります。グリッド寸法がパラメータ私はそれに比べて、私は十分なスレッドを持っているように見える? – user3143237

+0

あなたのカードによって異なると思います。どのカードを使用していますか?私は多くのスレッドを持つカードを知らない。 – Milhous

+0

私はGeForce GTX 1050 Tiを使用しています – user3143237

関連する問題