Динамическое выделение постоянной памяти в CUDA - PullRequest
7 голосов
/ 07 ноября 2008

Я пытаюсь воспользоваться постоянной памятью, но мне трудно понять, как вкладывать массивы. У меня есть массив данных, который имеет значение для внутренних данных, но они различны для каждой записи. Поэтому, основываясь на следующем упрощенном коде, у меня есть две проблемы. Во-первых, я не знаю, как распределять данные, на которые указывают члены моей структуры данных. Во-вторых, поскольку я не могу использовать 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);
}

Спасибо за любую помощь. : -)

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

Я думаю, что постоянная память составляет 64 КБ, и вы не можете выделить ее динамически, используя CudaMalloc Он должен быть объявлен постоянным, скажем,

__device__ __constant__ data mydata[100];

Точно так же вам не нужно освобождать его. Кроме того, вы не должны передавать ссылку на него через указатель, просто обращайтесь к нему как к глобальной переменной. Я попытался сделать аналогичную вещь, и это дало мне segfault (в devicemu).

2 голосов
/ 09 февраля 2011

Эти две темы должны вам помочь:

http://forums.nvidia.com/index.php?showtopic=30269&hl=embedded

1 голос
/ 25 февраля 2011

Нет, вы не можете этого сделать.

Постоянная память (не более 64 КБ) может быть жестко запрограммирована только перед компиляцией.

Однако вы можете назначить текстурную память на лету, которая также кэшируется на устройстве.

0 голосов
/ 23 марта 2009

Почему бы вам просто не использовать так называемое «упакованное» представление данных? Такой подход позволяет вам поместить все необходимые данные в одномерный байтовый массив. Например, если вам нужно хранить

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)]
]
...