CUDA中共享内存的重新分配 我有一个关于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]; ........ } }

CUDA中共享内存的重新分配 我有一个关于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]; ........ } },cuda,shared-memory,Cuda,Shared Memory,共享内存不能同时容纳共享_节点和s_距离_矩阵。但它可以分别容纳每一个(我已经测试过)。在第二遍中,程序无法识别共享_节点(从第一遍开始),但显示了一个错误,即共享内存没有足够的空间。看起来,仍然为shared_nodes变量分配了一些空间。有没有办法破坏这种分配(比如cudaFree)?还有其他建议吗 分配一个足够大的非类型化缓冲区,以容纳任意一个数组,并为算法的每个过程重新解释数组: __global__ void dist_calculation(...) { const unsig

共享内存不能同时容纳共享_节点和s_距离_矩阵。但它可以分别容纳每一个(我已经测试过)。在第二遍中,程序无法识别共享_节点(从第一遍开始),但显示了一个错误,即共享内存没有足够的空间。看起来,仍然为shared_nodes变量分配了一些空间。有没有办法破坏这种分配(比如cudaFree)?还有其他建议吗

分配一个足够大的非类型化缓冲区,以容纳任意一个数组,并为算法的每个过程重新解释数组:

__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);    
}
\uuuuu全局\uuuuuu无效距离计算(…)
{
常量unsigned int num_bytes1=sizeof(unsigned short)*(节点数-1)*块大小;
const unsigned int num_bytes2=sizeof(float)*(节点数)*(节点数-1))/2;
const unsigned int num_shared_bytes=num_bytes1>num_bytes2?num_bytes1:num_bytes2;
__共享字符smem[共享字节数];
无符号短*共享_节点=重新解释_转换(smem);
第一个_过程(共享_节点);
浮动*距离矩阵=重新解释铸件(smem);
第二遍(距离矩阵);
}

分配一个足够大的非类型缓冲区,以容纳任意一个数组,并为算法的每个过程重新解释数组:

__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);    
}
\uuuuu全局\uuuuuu无效距离计算(…)
{
常量unsigned int num_bytes1=sizeof(unsigned short)*(节点数-1)*块大小;
const unsigned int num_bytes2=sizeof(float)*(节点数)*(节点数-1))/2;
const unsigned int num_shared_bytes=num_bytes1>num_bytes2?num_bytes1:num_bytes2;
__共享字符smem[共享字节数];
无符号短*共享_节点=重新解释_转换(smem);
第一个_过程(共享_节点);
浮动*距离矩阵=重新解释铸件(smem);
第二遍(距离矩阵);
}

如果第一次传递函数和第二次传递函数互不相关,可以尝试分离这些函数。如果第一次传递函数和第二次传递函数互不相关,可以尝试分离这些函数。