Struct 如何将单个结构复制到全局内存中?

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问题,但将单个结

我想将每个线程使用的一组初始化值复制到全局内存中。我将它们总结为一个结构。但是,将其放入全局内存会出现多个问题。首先,VS2015告诉我该行的_常量_变量不支持动态初始化: __常量uuu initVals结构d u initVals

其次,它告诉我在这行中没有合适的从initValsStruct到const void*的转换函数: cudaMemcpyToSymbold_initVals和h_initVals,sizeofinitvals结构

这可能是一个非常基本的C或CUDA问题,但将单个结构复制到全局内存的最佳方法是什么

我尝试了代码中的内容;我在CUDA开发论坛的某个地方找到了一个示例,其中一些常量内存(1024个元素的int数组)以相同的方式初始化

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
}