为什么我收到“__constant__ 变量不支持动态初始化”?

问题描述 投票:0回答:2

我有以下结构:

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>))

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

那么,为什么我收到错误“

__constant__
变量不支持动态初始化”?

cuda constants nvidia
2个回答
0
投票
int center{};
int width{};

初始化

center
width
,另外,根据
vec
vec_set
的定义方式,它们可能有自己的构造函数。


0
投票

要对通过动态初始化定义的此类结构使用常量内存,一个通用解决方案是:

结构体定义:

struct STRUCT_WITH_DI {
....
};

__constant__
中的
.cu
定义为数组:

__constant__ char struct_data_arr[sizeof(STRUCT_WITH_DI)];

__constant__ array
对流到结构体:

__global__ void compute_kernel(){
    const STRUCT_WITH_DI* struct_data_ptr = reinterpret_cast<const STRUCT_WITH_DI*>(struct_data_arr);
    const STRUCT_WITH_DI &struct_data = *struct_data_ptr;
}

将结构体数据复制到

__constant__
内存:

cudaMemcpyToSymbolAsync((const void*) &struct_data_arr,  (const void*) &struct_arg,
                                         sizeof(struct_arg), 0, cudaMemcpyHostToDevice, c_stream )
© www.soinside.com 2019 - 2024. All rights reserved.