У меня есть ядро, которое использует около 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 */);
}
Если вы позволите kernel_func
закончить (например, с cudaDeviceSynchronize()
), то я сомневаюсь, что my_array
по-прежнему «занимает память», как вы предлагаете, после завершения работы ядра, то есть в точке этого комментария:
// my_array is still occupying memory are this point
Вы могли бы быть более уверенными, позвонив cudaMemGetInfo () в таком случае.
Тем не менее, вероятно, вы испытываете какую-то фрагментацию памяти.
Единственный способ, которым я знаю, чтобы «почистить планшет», — это позвонить cudaDeviceReset()
в таком случае. Однако это уничтожит все операции, а также любые выделения на GPU, поэтому вы должны делать это только тогда, когда у вас нет никаких других действий с GPU, и вы должны перераспределять любые данные GPU, которые вам нужны после вызова cudaDeviceReset()
,
Конечно, если вы можете организовать свои распределения с помощью cudaMalloc
вместо этого это может быть проще.
Других решений пока нет …