Закрепленная память в Nvidia CUDA - PullRequest
2 голосов
/ 23 марта 2012

Я пишу программу добавления матриц для графических процессоров, использующих потоки и явно закрепленную память. Итак, я выделил 3 матрицы в закрепленной памяти, но после определенных измерений это показывает ошибку API 2: недостаточно памяти. Можно использовать более 800 МБ. Есть ли способ, которым мы можем контролировать этот верхний предел? Мой конфиг sys: nVidia GEForce 9800GTX Intel Core 2 Quad Для потокового исполнения код выглядит следующим образом

(int i=0;i<no_of_streams;i++)
    {
       cudaMemcpyAsync(device_a+i*(n/no_of_streams),hAligned_on_host_a+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyHostToDevice,streams[i]);
       cudaMemcpyAsync(device_b+i*(n/no_of_streams),hAligned_on_host_b+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyHostToDevice,streams[i]);
       cudaMemcpyAsync(device_c+i*(n/no_of_streams),hAligned_on_host_c+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyHostToDevice,streams[i]);
       matrixAddition<<<blocks,threads,0,streams[i]>>>(device_a+i*(n/no_of_streams),device_b+i*(n/no_of_streams),device_c+i*(n/no_of_streams));
       cudaMemcpyAsync(hAligned_on_host_a+i*(n/no_of_streams),device_a+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyDeviceToHost,streams[i]);
       cudaMemcpyAsync(hAligned_on_host_b+i*(n/no_of_streamss),device_b+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyDeviceToHost,streams[i]);
       cudaMemcpyAsync(hAligned_on_host_c+i*(n/no_of_streams),device_c+i*(n/no_of_streams),nbytes/no_of_streams,cudaMemcpyDeviceToHost,streams[i]));

    }

1 Ответ

1 голос
/ 26 марта 2012

Итак, вы не указали, происходит ли это после вызова функции cudaMalloc или cudaHostAlloc.

Закрепленная память является ограниченным ресурсом. Любая память, определенная как находящаяся в закрепленной памяти, всегда должна быть в ОЗУ. Таким образом, это оставляет меньше места в оперативной памяти для других системных приложений. Это означает, что у вас не может быть 4 ГБ закрепленной памяти, если у вас 4 ГБ ОЗУ, иначе ничего не может работать.

800 МБ может быть системным ограничением. Учитывая, что это четверть вашей оперативной памяти, это может быть разумным пределом. Это также очень близко к размеру вашей глобальной памяти. Сбой на карте не приведет к сбою на хосте, поэтому, если он жалуется, не выполняя что-то вроде cudaGetLastError, это, вероятно, проблема на хосте.

Извините, я не знаю особенностей увеличения лимита закрепленной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...