2012-03-23 3 views
2

Я пишу программу сложения матриц для графических процессоров, используя потоки и, очевидно, закрепленную память. Так что я выделил 3 матрицы в закрепленной памяти, но после определенных измерений отображает ошибку API 2: из памяти. Моя оперативная память - 4 ГБ но я не могу использовать более 800 МБ. Есть ли способ, которым мы можем контролировать этот верхний предел? Мой SYS конфигурации: NVIDIA Geforce 9800GTX Intel Core 2 Quad для поточного кода выполнения выглядит следующим образомПрикрепленная память в Nvidia CUDA

(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])); 

    } 
+0

Могло быть множество причин, от фрагментированной памяти до плохого кода. Было бы хорошо видеть, что вы делаете, чтобы действительно сделать полезное предложение. –

+0

потока кода следующим образом '2 потоков, созданных для каждого потока cudamemcpy (половина части массива, hostToDevice) ядро ​​запуска cudaMemcpy (halfportion массива, DeviceToHost) Ничего особенного программа работает нормально с разницы в производительности, я просто хочу, чтобы у вас было больше памяти, поскольку это происходит потому, что глобальная память GPU составляет около 1 ГБ? –

+2

Поместите любой код, отредактировав вопрос. –

ответ

1

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

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

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

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

+0

Но у меня был такой же эксперимент на Tesla C2070, который имеет 4 ГБ глобальной памяти. В то же время работает та же программа, где каждая матрица принимает 256-мегабайтную программу памяти, внезапно убивается ... это из-за той же проблемы? –

+0

Похоже, что это не карта. Попробуйте добавить вызовы cudaThreadSynchronize и cudaGetLastError после каждого выделения, и вы должны увидеть, какой из них неисправен. –

Смежные вопросы