Ошибка CUDA cudaMalloc после запуска ядра с огромными статическими массивами

У меня есть ядро, которое использует около 2 ГБ локальной памяти. мой cudaMalloc который пытается выделить 2,5 ГБ памяти не удается, если я запускаю это kernel_func до.

Я обнаружил, что 2 ГБ памяти все еще заняты после завершения работы kernel_func, который оставляет только 1,5 ГБ для моего cudaMalloc, У кого-нибудь есть решение или объяснение?

Я знаю, что используя глобальную память для kernel_func может решить проблему, но по какой-то причине мне нужно использовать локальную память для этого огромного локального статического массива.

__global__ kernel_func() {

// The huge static array goes here
short my_array[50000];

}

int main() {

kernel_func<<<64, 128>>>();
// my_array is still occupying memory are this point

// This cudaMalloc will fail with insufficient memory
cudaMalloc(/* 2.5GB data */);
}

0

Решение

Если вы позволите kernel_func закончить (например, с cudaDeviceSynchronize()), то я сомневаюсь, что my_array по-прежнему «занимает память», как вы предлагаете, после завершения работы ядра, то есть в точке этого комментария:

    // my_array is still occupying memory are this point

Вы могли бы быть более уверенными, позвонив cudaMemGetInfo () в таком случае.

Тем не менее, вероятно, вы испытываете какую-то фрагментацию памяти.

Единственный способ, которым я знаю, чтобы «почистить планшет», — это позвонить cudaDeviceReset() в таком случае. Однако это уничтожит все операции, а также любые выделения на GPU, поэтому вы должны делать это только тогда, когда у вас нет никаких других действий с GPU, и вы должны перераспределять любые данные GPU, которые вам нужны после вызова cudaDeviceReset(),

Конечно, если вы можете организовать свои распределения с помощью cudaMalloc вместо этого это может быть проще.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]