0

cuda で複数のカーネル関数を起動したいので、2 つの別々のグリッド セット、ブロック名、および各セットの値が異なることを宣言しています。例えば:

    dim3 gridDim_1(val_1,1);
    dim3 blockDim_1(val_2,val_3);

    dim3 gridDim_2(val_4,1);
    dim3 blockDim_2(val_5,val_6);

    for(i=0;i<somenum;i++)
   {
     kernel_1<<<gridDim_1,blockDim_1>>>(agr1,arg2);
     kernel_2<<<gridDim_2,blockDim_2>>>(agr3,arg4);
   }

しかし、コンパイラは error: gridDim_1 is unknown であり、他のブロックとグリッドの宣言と同様のエラーをスローしています。では、グリッドとブロックの名前が異なるこれら 2 つのカーネルを起動するにはどうすればよいでしょうか? ここで、グリッド内のブロック数とブロック内のスレッド数は、ユーザー入力に何らかの形で依存することに言及する必要があります。助けてくれてありがとう。

実際、メインコードは非常に大きく、エラーを取り除くために時々変更しています.問題があると思われる場所にのみその一部を投稿しています:

int k,sim_step;
int counter_top,counter_bottom;
............
...................

for(k=0;k<=sim_step;k++)
{  

    dim3 gridDim(1,1);
    dim3 blockDim(counter_top,1,1); 

    agent_movement_top<<<gridDim,blockDim>>>(args..)  ;

    dim3 gridDim(1,1);
    dim3 blockDim(counter_bottom,1,1);  

    agent_movement_bot<<<gridDim,blockDim>>>(args...);

} 

現在発生しているエラーは次のとおりです。エラー LNK2001: 未解決の外部シンボル _gridDim エラー LNK2001: 未解決の外部シンボル _blockDim

4

1 に答える 1

3

同じ変数を 2 回定義しています。{たとえば、追加のブロック ( ...}ペア)を使用して各定義の範囲を制限するだけで、そのエラーを排除できます。

int k,sim_step;
int counter_top,counter_bottom;
............
...................

for(k=0;k<=sim_step;k++)
{  
    {
        dim3 gridDim(1,1);
        dim3 blockDim(counter_top,1,1); 

        agent_movement_top<<<gridDim,blockDim>>>(args..)  ;
    }
    {
        dim3 gridDim(1,1);
        dim3 blockDim(counter_bottom,1,1);  

        agent_movement_bot<<<gridDim,blockDim>>>(args...);
    }
}
于 2012-11-08T22:11:09.630 に答える