Проблемы с cudaMalloc и ошибкой «недостаточно памяти» - PullRequest
0 голосов
/ 20 января 2011

Существуют ли какие-либо ограничения для выделения памяти устройства, несмотря на то, что она не превышает доступную память? Я получаю следующую ошибку после попытки выделить 64 МБ:

cudaSafeCall() Runtime API error : out of memory.

Однако, согласно cuMemGetInfo , осталось более 200 МБ.

Вот сценарий:

size_t size = 4096 * 4096 * sizeof (float);
cuMemGetInfo(&fr, &ttl); // fr indicates 284 MB
cutilSafeCall(cudaMalloc((void**) &tmp, size));
p1 = tmp;
cuMemGetInfo(&fr, &ttl); // fr indicates 220 MB
cutilSafeCall(cudaMalloc((void**) &tmp, size)); // this fails !!!
p2 = tmp;

Чего мне не хватает?

Я использую:

Cuda compilation tools, release 3.2, V0.2.1221
NVidia Driver 260.19.26
Linux(Slackware) x86

Обновление:

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

Ответы [ 3 ]

2 голосов
/ 23 января 2011

Как отметил Томас, проблема заключается в фрагментации памяти. (Подтверждено экспериментом. Я не нашел надежного источника для ссылки)

1 голос
/ 21 января 2011

Кажется, вы перераспределяете ту же память, что и при повторном использовании tmp.Если вы привыкли к объектно-ориентированному коду, вы, вероятно, ошиблись указателем со ссылками на объекты.

Следующий код должен дать вам тот же результат:

size_t size = 4096 * 4096 * sizeof(float);
float* p1;
float* p2;
cutilSafeCall(cudaMalloc((void**) &p1, size));
cutilSafeCall(cudaMalloc((void**) &p2, size));
0 голосов
/ 20 января 2011

Вы используете один и тот же указатель памяти, чтобы выделить память дважды. Я знаю, что вы используете p1 для резервного копирования первого адреса выделения памяти, но вы забыли очистить tmp после этого. Возможно cudaMalloc() терпит неудачу из-за этого. Это просто дикое предположение.

size_t size = 4096 * 4096 * sizeof (float);
cuMemGetInfo(&fr, &ttl); 
cutilSafeCall(cudaMalloc((void**) &tmp, size));
p1 = tmp;
tmp = 0; // or NULL to clear the pointer
cuMemGetInfo(&fr, &ttl); 
cutilSafeCall(cudaMalloc((void**) &tmp, size));
p2 = tmp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...