Memory management 正在将主机内存复制到cuda___;设备__;变量

Memory management 正在将主机内存复制到cuda___;设备__;变量,memory-management,cuda,copy,Memory Management,Cuda,Copy,我试图用谷歌来解决我的问题,但失败了。有很多片段并不完全符合我的情况,尽管我认为这是一个相当标准的情况 我必须将几个不同的数据阵列传输到cuda。它们都是具有动态大小的简单结构数组。因为我不想把所有的东西都放到cuda内核调用中,所以我想,\uu设备\uuu变量应该正是我所需要的 这是我试图将主机数据复制到\uuu设备\uuu变量的方式: // MaterialDescription.h struct MaterialDescription { unsigned char type;

我试图用谷歌来解决我的问题,但失败了。有很多片段并不完全符合我的情况,尽管我认为这是一个相当标准的情况

我必须将几个不同的数据阵列传输到cuda。它们都是具有动态大小的简单结构数组。因为我不想把所有的东西都放到cuda内核调用中,所以我想,
\uu设备\uuu
变量应该正是我所需要的

这是我试图将主机数据复制到
\uuu设备\uuu
变量的方式:

// MaterialDescription.h
struct MaterialDescription {
    unsigned char type;
    unsigned char diffuseR, diffuseG, diffuseB;
    __device__ __forceinline__ float4 diffuseColour() const {  return make_float4((float) diffuseR / 255.f, (float) diffuseG / 255.f, (float) diffuseB / 255.f, 0); }
};

// kernel.h
__device__ MaterialDescription* g_materials;
__global__ void deferredRenderKernel() {
     something = g_materials[indexDependingOnData].diffuseColour();
}

//Cuda.cu
const std::vector<MaterialDescription>& materials = getData();

// version 1
cudaMemcpyToSymbol(g_materials, &materials.front(), sizeof(MaterialDescription) * materialCount);

// version 2
MaterialDescription* ptr;
cudaMalloc((void**)&ptr, sizeof(MaterialDescription) * materialCount);
cudaMemcpy(ptr, &materials.front(), sizeof(MaterialDescription) * materialCount, cudaMemcpyHostToDevice);
cudaMemcpyToSymbol(g_materials, ptr, sizeof(MaterialDescription) * materialCount);

// version 3
cudaMalloc((void**)&g_materials, sizeof(MaterialDescription) * materialCount);
cudaMemcpyToSymbol(g_materials, &materials.front(), sizeof(MaterialDescription) * materialCount);

deferredRenderKernel<<<numBlocks, threadsPerBlock>>();
其他变量和结构同上

编辑:

解决方案 它终于按照我想要的方式工作了

材料说明.h

struct MaterialDescription {
    unsigned char type;
    unsigned char diffuseR, diffuseG, diffuseB;
    __device__ __forceinline__ float4 diffuseColour() const {  return make_float4((float) diffuseR / 255.f, (float) diffuseG / 255.f, (float) diffuseB / 255.f, 0); }
};
__device__ MaterialDescription* g_materials;
__global__ void deferredRenderKernel() {
    something = g_materials[indexDependingOnData].diffuseColour();
}
kernel.h

struct MaterialDescription {
    unsigned char type;
    unsigned char diffuseR, diffuseG, diffuseB;
    __device__ __forceinline__ float4 diffuseColour() const {  return make_float4((float) diffuseR / 255.f, (float) diffuseG / 255.f, (float) diffuseB / 255.f, 0); }
};
__device__ MaterialDescription* g_materials;
__global__ void deferredRenderKernel() {
    something = g_materials[indexDependingOnData].diffuseColour();
}
Cuda.cu

const std::vector<MaterialDescription>& materials = getData();
MaterialDescription* dynamicArea;

// allocate memory on the device for our data
cudaMalloc((void**)&dynamicArea, sizeof(MaterialDescription) * materialCount); 

// copy our data into the allocated memory
cudaMemcpy(dynamicArea, &materials.front(), sizeof(MaterialDescription) * materialCount, cudaMemcpyHostToDevice);

// copy the pointer to our data into the global __device__ variable.
cudaMemcpyToSymbol(g_materials, &dynamicArea, sizeof(MaterialDescription*));
const std::vector&materials=getData();
材料描述*DynamicCarea;
//在设备上为我们的数据分配内存
Cudamaloc((无效**)和dynamicArea,sizeof(材料说明)*材料账户;
//将数据复制到分配的内存中
cudaMemcpy(dynamicArea,&materials.front(),sizeof(MaterialDescription)*materialCount,cudaMemcpyHostToDevice);
//将指向数据的指针复制到全局设备变量中。
CUDAMEMCPITOSYMBOL(g_材料和dynamicArea,尺寸(材料说明*);

如果你在问这样的问题时给出一个完整的例子,那就太好了。查看您对
MaterialDescription
材料的定义将非常有用。看看“为什么我的代码不起作用?”

这只保存指针的存储:

不能将整个结构/对象复制到指针上

当您像这样分配一个设备变量时,它是一个静态分配,这意味着需要在编译时知道大小。因此,如果在编译时知道大小(或最大大小),可以执行以下操作:

__device__ MaterialDescription g_materials[MAX_SIZE];

// this assumes materialCount <= MAX_SIZE
cudaMemcpyToSymbol(g_materials, &(materials.front()), sizeof(MaterialDescription) * materialCount);
\uuuuu设备\uuuuu材料说明g\u材料[最大尺寸];

//对不起,我以为我把所有相关的东西都放在那里了。但是你是对的,结构和材料也很重要。所以没有办法让全局
\uuu设备\uuu
内存区域具有动态大小?使用
cudamaloc
进行动态分配。然后您可以
cudaMemcpyToSymbol
通过
cudamaloc
返回的指针,或者将其作为内核参数传递。多亏了你们两位。我现在就知道了,稍后会用解决方案更新这个问题。如果您的结构仅由POD类型组成,那么您的版本#2几乎是正确的。只需将最后一个memcpy的大小更改为正确的大小(您正在复制的只是一个指针),它就可以工作了。不仅需要大小,还需要一个引用:)我将在一秒钟内更新工作版本。
__device__ MaterialDescription g_materials[MAX_SIZE];

// this assumes materialCount <= MAX_SIZE
cudaMemcpyToSymbol(g_materials, &(materials.front()), sizeof(MaterialDescription) * materialCount);