【问题标题】:Why I am getting "dynamic initialization is not supported for a __constant__ variable"?为什么我得到“__constant__ 变量不支持动态初始化”?
【发布时间】:2021-07-09 08:35:36
【问题描述】:

我有以下结构:

enum BoundSide { right, left, top, bottom, back, front };

template<typename T, size_t D>
using vec = array<T,D>;

//fpr short and static Vector Fields like c_i
template<typename T, size_t D, size_t Q>
using vec_set = vec<vec<T, D>, Q>;

template<typename T, size_t D>
struct VELOCITY_BOUND_DEV;

template<typename T>
struct VELOCITY_BOUND_DEV<T, 2>
{
  BoundSide side;
  int center{};
  int width{};
  T u_w;        //velocity
};


template<typename T, int D, int Q>
struct SimDomain_dev 
{
  vec_set<T, D, Q> c;       //discrete velocity-set
  vec<T, Q> w;          //discrete weights
  vec<grid_size_t, D> gridDim_L;

  VELOCITY_BOUND_DEV<T, D> bound;
}

我像这样声明了一个__constant__ 变量:

template<typename T, int D, int Q>
__constant__ SimDomain_dev<T, D, Q> sd_dev;

然后我将数据从临时主机变量复制到设备变量,如下所示:

 cudaMemcpyToSymbol(sd_dev<T, D, SimDomain<T, D>::Q>, &sd_temp,0, sizeof(SimDomain_dev<T,D, SimDomain<T, D>::Q>))

vecvec_set 中的 Class 数组是一个在设备端工作的容器类(有效)。

那么,为什么我会收到错误消息“__constant__ 变量不支持动态初始化”?

【问题讨论】:

  • vec_setvec 是什么?我猜想有一个构造函数试图在某个地方运行。你不能这样做
  • 您的编辑没有回答问题。他们有构造函数吗?
  • 这些是类类型数组的别名。这个容器是 std.:array 的替代品,也可以在设备上使用。

标签: cuda constants nvidia


【解决方案1】:
int center{};
int width{};

初始化centerwidth,另外,根据vecvec_set的定义方式,它们可能有自己的构造函数。

【讨论】:

  • vec_setvec 是类 array 的构造。这是std::array 的替代品,也可以在设备上使用。
  • 正如@talonmies 所说,他们不能有构造函数
  • 好的,由于centerwidth的初始化,我得到了错误。谢谢您的帮助。 :)
猜你喜欢
  • 2015-01-18
  • 2018-09-15
  • 1970-01-01
  • 2020-05-31
  • 2020-12-05
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多