Struct 如何将单个结构复制到全局内存中?
我想将每个线程使用的一组初始化值复制到全局内存中。我将它们总结为一个结构。但是,将其放入全局内存会出现多个问题。首先,VS2015告诉我该行的_常量_变量不支持动态初始化: __常量uuu initVals结构d u initVals 其次,它告诉我在这行中没有合适的从initValsStruct到const void*的转换函数: cudaMemcpyToSymbold_initVals和h_initVals,sizeofinitvals结构 这可能是一个非常基本的C或CUDA问题,但将单个结构复制到全局内存的最佳方法是什么 我尝试了代码中的内容;我在CUDA开发论坛的某个地方找到了一个示例,其中一些常量内存(1024个元素的int数组)以相同的方式初始化Struct 如何将单个结构复制到全局内存中?,struct,cuda,gpu-constant-memory,Struct,Cuda,Gpu Constant Memory,我想将每个线程使用的一组初始化值复制到全局内存中。我将它们总结为一个结构。但是,将其放入全局内存会出现多个问题。首先,VS2015告诉我该行的_常量_变量不支持动态初始化: __常量uuu initVals结构d u initVals 其次,它告诉我在这行中没有合适的从initValsStruct到const void*的转换函数: cudaMemcpyToSymbold_initVals和h_initVals,sizeofinitvals结构 这可能是一个非常基本的C或CUDA问题,但将单个结
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结构作为参数时一样编译和运行。阅读您的代码时,我不清楚您想做什么。但是你的问题是,我想把每个线程使用的一组初始化值复制到全局内存中,所以我选择用一种非常直接的方式来回答这个问题。数据通过cudaMemcpy函数从主机复制到设备。下面是一个已解决的示例 结构:
typedef struct
{
unsigned int voxels_x;
unsigned int voxels_y;
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;
在主机上初始化并使用cudaMemcpy将其复制到设备:
您还可以使用CuDamallocManager,它既方便又干净。我极力推荐
内核调用应该在其函数签名中使用initValsStruct指针
__device__ void computation(int currentComputation, initValsStruct *ptr, IOdataPtr *ptr) //actual computation kernel
{
// do something
}
这会将您的结构放入全局内存中,任何接收指向它的指针的设备函数都可以使用它。您的代码似乎试图使用_constant_uuu关键字,这表明您正在尝试使用设备端常量缓存。我建议首先尝试使用全局内存,了解如何使用CUDAAPI的基本功能,然后深入研究使用常量缓存。您的结构有一些默认值,例如动态初始化,这是禁止的;在没有任何动态初始化的情况下重新定义结构,正如我在上面所做的那样,然后首先在主机上初始化结构,然后使用cudaMemcpyToSymbol 这是怎么回事。问题中的_constant _uu结构不包含主机代码无法工作的指针,它试图复制到未初始化的指针中。问题或答案中都没有内核。问题的答案意味着注释块中的初始化。答案的要点是,提问者应该首先关注使用全局内存,使用cudaMemcpy,然后再讨论更高级的主题,如常量缓存
__device__ void computation(int currentComputation, initValsStruct *ptr, IOdataPtr *ptr) //actual computation kernel
{
// do something
}