我有以下结构:
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__
变量不支持动态初始化”?
int center{};
int width{};
初始化
center
和 width
,另外,根据 vec
和 vec_set
的定义方式,它们可能有自己的构造函数。
要对通过动态初始化定义的此类结构使用常量内存,一个通用解决方案是:
结构体定义:
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 )