2017-01-19 14 views
0

Я использую функцию cusparseDgtsv_nopivot для решения трехдиагональной системы уравнений. выход корректен, но функция не позволяет использовать многопоточность cuda. Профилировщик nvvp показывает, что хотя каждый вызов этого решателя находится в другом потоке, он никогда не перекрывается. Я думал о неявной синхронизации и обнаружил через nvvp, что функция библиотеки имеет много вызовов cudaFree между ними. Есть ли способ избежать этой неявной синхронизации?Огромное использование cudaFree от tridiagonal solver cuSparse

Псевдокод использования 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 был поставлен и решен дело с матрицами: here.

ответ

1

Действительно короткий ответ - нет. В настоящее время нет способа изменить поведение синхронизации cudaFree в API среды выполнения.

Итак, если вы выдвигаете гипотезу, причиной проблемы является внутреннее использование malloc и бесплатное использование cuSolver, тогда единственное, что нужно сделать, - сообщить о своем случае пользователю NVIDIA и посмотреть, могут ли они либо предложить обходной путь, или предоставить «экспертную» версию подпрограммы, в которой вызывающий управляет явным пространством.

+0

спасибо. вы говорите «как вы выдвигаете гипотезу». Является ли синхронная функция, такая как cudaFree, недостаточной для прерывания параллельного параллелизма? –