2

CUDA C++ プログラミングについて質問があります。共有メモリを使用しています。しかし、より大きな共有メモリが必要です。そのため、共有メモリを再利用しようとしていました。私のコードは次のようなものです:

__global__ void dist_calculation(...){

   ..........
   {
        //1st pass
       __shared__ short unsigned int shared_nodes[(number_of_nodes-1)*blocksize];

       ............

   }

   {
       //2nd pass
       __shared__ float s_distance_matrix[(number_of_nodes*(number_of_nodes-1))/2];

       ........
   }
}

共有メモリは、shared_nodes と s_distance_matrix の両方を一緒に収容することはできません。ただし、それぞれを個別に収容できます(テスト済み)。2 番目のパスでは、プログラムは shared_nodes を認識できません (1 番目のパスと同じです) が、共有メモリに十分なスペースがないというエラーが表示されます。そのため、shared_nodes 変数にまだスペースが割り当てられているようです。その割り当てを破棄する方法はありますか (cudaFree など)? または他の提案はありますか?

4

1 に答える 1

4

いずれかの配列を収容するのに十分な大きさの単一の型指定されていないバッファーを割り当て、アルゴリズムのパスごとに配列を再解釈します。

__global__ void dist_calculation(...)
{
   const unsigned int num_bytes1 = sizeof(unsigned short) * (number_of_nodes-1) * block_size;

   const unsigned int num_bytes2 = sizeof(float) * (number_of_nodes) * (number_of_nodes-1)) / 2;

   const unsigned int num_shared_bytes = num_bytes1 > num_bytes2? num_bytes1: num_bytes2;

   __shared__ char smem[num_shared_bytes]; 

   unsigned short *shared_nodes = reinterpret_cast<unsigned int*>(smem);
   first_pass(shared_nodes);

   float *distance_matrix = reinterpret_cast<unsigned int*>(smem);
   second_pass(distance_matrix);    
}
于 2013-05-31T01:24:09.860 に答える