Память устройства для кода ядра CUDA: это явно управляемое? - PullRequest
0 голосов
/ 22 августа 2011

Контекст: CUDA 4.0, 64-битная версия Linux, модуль ядра NVIDIA UNIX x86_64 270.41.19, на GeForce GTX 480.

Я пытаюсь найти утечку памяти (устройства) в моей программе. Я использую API времени выполнения и cudaGetMemInfo (бесплатно, всего) для измерения использования памяти устройства. Я заметил значительную потерю (в данном случае 31M) после выполнения ядра. Сам код ядра не выделяет память устройства. Так что я думаю, это код ядра, который остается в памяти устройства. Даже я бы подумал, что ядро ​​не такое большое. (Есть ли способ определить размер ядра?)

Когда код ядра загружается в память устройства? Я думаю, при выполнении строки кода хоста:

kernel<<<geom>>>(params);

Правильно? И остается ли код в памяти устройства после звонка? Если да, могу ли я явно выгрузить код?

Меня беспокоит фрагментация памяти устройства. Подумайте о большой последовательности распределения памяти чередующегося устройства и выполнения ядра (разные ядра) Затем через некоторое время памяти устройства становится довольно мало. Даже если вы освободите часть памяти, код ядра останется свободным для нового выделения. Это приведет к огромной фрагментации памяти через некоторое время. Так ли был разработан CUDA?

1 Ответ

2 голосов
/ 22 августа 2011

Распределение памяти, которое вы наблюдаете, используется контекстом CUDA. Он содержит не только код ядра, но и любые другие символы устройства статической области видимости, текстуры, пространство для каждого потока для локальной памяти, printf и heap, постоянную память, а также память gpu, необходимую для драйвера и самой среды выполнения CUDA. Большая часть этой памяти выделяется только один раз, когда загружается двоичный модуль или код PTX JIT компилируется драйвером. Вероятно, лучше думать об этом как о фиксированных накладных расходах, а не как об утечке. В коде PTX существует ограничение в 2 миллиона инструкций, и текущее оборудование использует 32-битные слова для инструкций, поэтому объем памяти даже самого большого допустимого кода ядра невелик по сравнению с другими глобальными накладными расходами памяти, которые ему требуются.

В последних версиях CUDA существует API-вызов времени выполнения cudaDeviceSetLimit, который позволяет некоторый контроль над количеством пустого места, которое может занять данный контекст. Имейте в виду, что можно установить ограничения на значения, которые ниже, чем требуется для кода устройства, и в этом случае могут произойти сбои при выполнении.

...