C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 带有动态共享内存的模板化CUDA内核大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在一个程序中调用带有动态分配的共享内存的模板化CUDA内核的不同实例.我的第一个天真的方法是写:
template<typename T>
__global__ void kernel(T* ptr)
{
  extern __shared__ T smem[];
  // calculations here ...                                                                                                                                          
}

template<typename T>
void call_kernel( T* ptr,const int n )
{
  dim3 dimBlock(n),dimGrid;
  kernel<<<dimGrid,dimBlock,n*sizeof(T)>>>(ptr);
}

int main(int argc,char *argv[])
{
  const int n = 32;
  float *float_ptr;
  double *double_ptr;
  cudaMalloc( (void**)&float_ptr,n*sizeof(float) );
  cudaMalloc( (void**)&double_ptr,n*sizeof(doublE) );

  call_kernel( float_ptr,n );
  call_kernel( double_ptr,n ); // problem,2nd instantiation

  cudaFree( (void*)float_ptr );
  cudaFree( (void*)double_ptr );
  return 0;
}

但是,此代码无法编译. nvcc给我以错误信息:

@H_734_2@main.cu(4): error: declaration is incompatible with prevIoUs "smem" (4): here detected during: instantiation of "void kernel(T *) [with T=double]" (12): here instantiation of "void call_kernel(T *,int) [with T=double]" (24): here

我知道我遇到了@L_607_7@冲突,因为共享内存被声明为extern.然而,据我所知,如果我想在运行时定义它的大小,那就无法解决这个问题.

所以,我的问题是:有没有任何优雅的方式来获得所需的行为?优雅我的意思是没有代码重复等.

解决方法

动态分配的共享内存实际上只是一个大小(以字节为单位)和为内核设置的指针.所以像这样的东西应该工作:

替换这个:

extern __shared__ T smem[];

有了这个

extern __shared__ __align__(sizeof(T)) unsigned char my_smem[];
T *smem = reinterpret_cast<T *>(my_smem);

您可以在programming guide中看到重新构建动态分配的共享内存指针的其他示例,这些示例可以满足其他需求.

编辑:更新我的答案,以反映@njuffa的评论.

大佬总结

以上是大佬教程为你收集整理的c – 带有动态共享内存的模板化CUDA内核全部内容,希望文章能够帮你解决c – 带有动态共享内存的模板化CUDA内核所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。