Огромное использование cudaFree из решателя трехдиагональной cuSparse
Я использую cusparseDgtsv_nopivot
функция для решения трехдиагональной системы уравнений. вывод правильный, но функция не использует cuda multi-streaming. Профилировщик nvvp показывает, что, хотя каждый вызов этого решателя находится в отдельном потоке, они никогда не перекрываются. Я подумал о неявной синхронизации и выяснил, что через nvvp библиотечная функция имеет много вызовов cudaFree между ними. Есть ли способ избежать этой неявной синхронизации?
Псевдокод использования cusparse:
create array of streams[];
create cusparse handle;
for (int i=0;i<Nsystem;i++){
cusparseSetStream(handle,stream[i]);
cusparseDgtsv_nopivot(handle, var for linear system i);
}
destroy cusaprse handle;
PS: похожая проблема cudafree была поднята и решена с матрицей: здесь.
1 ответ
Действительно короткий ответ - нет. В настоящее время нет способа изменить поведение синхронизации cudaFree в API времени выполнения.
Так что, если, как вы предполагаете, причиной проблемы является внутреннее использование malloc и бесплатное использование cuSolver, то единственное, что нужно сделать, это сообщить о вашем случае в NVIDIA и посмотреть, могут ли они предложить обходной путь или предоставить " экспертная версия подпрограммы, в которой вызывающая сторона явно управляет пустым пространством.