CUDA中常量内存的动态分配

isit 发布于 2018-05-21 constants 最后更新 2018-05-21 08:43 420 浏览

我试图利用恒定的内存,但我很难搞清楚如何嵌套数组。我拥有的是一系列数据,这些数据可以用于内部数据,但每个条目的数据都不相同。所以基于以下简化代码,我有两个问题。首先,我不知道如何分配数据结构成员指向的数据。其次,由于我不能将cudaGetSymbolAddress用于常量内存,我不确定是否可以传递全局指针(无法用普通的device内存)。

struct __align(16)__ data{
int nFiles;
int nNames;
int* files;
int* names;
};
__device__ __constant__ data *mydata;
__host__ void initMemory(...)
{
    cudaMalloc( (void **) &(mydata), sizeof(data)*dynamicsize );
    for(int i=; i lessthan dynamicsize; i++)
    {
        cudaMemcpyToSymbol(mydata, &(nFiles[i]), sizeof(int), sizeof(data)*i, cudaMemcpyHostToDevice);
        //...
        //Problem 1: Allocate & Set mydata[i].files
    }
}
__global__ void myKernel(data *constDataPtr)
{
    //Problem 2: Access constDataPtr[n].files, etc
}
int main()
{
    //...
    myKernel grid, threads (mydata);
}
感谢您提供的任何帮助。 :-)
已邀请:

funde

赞同来自:

你为什么不使用所谓的“打包”数据表示?这种方法允许您将所需的所有数据放入一维字节数组中。例如,如果你需要存储

struct data
{
    int nFiles;
    int nNames;
    int* files;
    int* names;
}
您可以将这些数据以这种方式存储在数组中:
[struct data (7*4=28 bytes)
    [int nFiles=3 (4 bytes)]
    [int nNames=2 (4 bytes)]
    [file0 (4 bytes)]
    [file1 (4 bytes)]
    [file2 (4 bytes)]
    [name0 (4 bytes)]
    [name1 (4 bytes)]
]

funde

赞同来自:

我认为常量内存是64K,你不能使用CudaMalloc动态分配它。它必须被宣布为常数,比如说,

__device__ __constant__ data mydata[100];
同样你也不需要释放它。此外,您不应该通过指针传递引用,只需将其作为全局变量进行访问即可。我试着做类似的事情,它给了我segfault(在devicemu中)。

set

赞同来自:

这两个线程应该可以帮助你: http://forums.nvidia.com/index.php?showtopic=30269&hl=embedded

laut

赞同来自:

不,你不能这样做。 常量内存(最大64KB)只能在编译之前进行硬编码。 但是,您可以随时在设备上缓存纹理内存。