我想将每个线程使用的一组初始化值复制到__global__
内存中。我已将它们总结为一个结构。__global__
但是,将其放入内存存在多个问题。首先,VS2015 告诉我__constant__
这一行的“变量不支持动态初始化”:
__constant__ initValsStruct d_initVals;
其次,它告诉我“在这一行中
没有合适的转换函数 from initValsStruct
to :const void *
cudaMemcpyToSymbol(d_initVals, &h_initVals, sizeof(initValsStruct));
这可能是一个非常基本的 C 或 CUDA 问题,但是将单个结构复制到__global__
内存的最佳方法是什么?
我尝试了代码中的内容;我在 CUDA 开发论坛的某个地方找到了一个示例,其中一些__constant__
内存(int
1024 个元素的数组)以相同的方式初始化。
typedef struct
{
unsigned int voxels_x = 0;
unsigned int voxels_y = 0;
unsigned int voxels_z;
//Input and output data amounts
unsigned int n_lines;
unsigned int TD_samples;
//amount of total calculations
unsigned int n_calc;
} initValsStruct;
initValsStruct h_initVals; //host struct to be copied into __global__ memory
__constant__ initValsStruct d_initVals; //where it has to be copied to
int main(){
//here I initialize every element of the initValsStruct h_initVals, so it is initialized
cudaMemcpyToSymbol(d_initVals, &h_initVals, sizeof(initValsStruct));
}
这是我访问它的方式:
typedef struct
{
int device = 0;
double *d_xre, *d_xim, //input device arrays
*d_yre, *d_yim, //output device arrays
*h_xre_pl, *h_xim_pl, //page locked input host arrays
*h_yre_pl, *h_yim_pl; //page locked output host arrays
} IOdataPtr;
__device__ void computation(int currentComputation, IOdataPtr ptr) //actual computation kernel
{
int index;
for (int i = 0; i < d_initVals.n_lines * PARAMETERS_PER_LINE; i++) {
index = currentComputation * d_initVals.n_lines * PARAMETERS_PER_LINE + i;
ptr.d_yre[index] = ptr.d_xre[index];
ptr.d_yim[index] = ptr.d_xim[index];
}
}
我希望它能够以与将 initVals 结构作为参数提供给内核时相同的方式进行编译和运行