大量使用来自 cuSparse 三对角求解器的 cudaFree
huge use of cudaFree from cuSparse tridiagonal solver
我正在使用 cusparseDgtsv_nopivot
函数求解三对角方程组。输出是正确的,但函数没有正确使用 cuda 多流。
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 问题:here。
真正简短的回答是否定的。目前无法在运行时 API.
内修改 cudaFree 的同步行为
因此,如果正如您假设的那样,问题的原因是内部使用 malloc 和 free with cuSolver,那么唯一要做的就是向 NVIDIA 报告您的用户案例,看看他们是否可以提出解决方法,或提供例程的 "expert" 版本,其中调用者显式管理 scratch space。
我正在使用 cusparseDgtsv_nopivot
函数求解三对角方程组。输出是正确的,但函数没有正确使用 cuda 多流。
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 问题:here。
真正简短的回答是否定的。目前无法在运行时 API.
内修改 cudaFree 的同步行为因此,如果正如您假设的那样,问题的原因是内部使用 malloc 和 free with cuSolver,那么唯一要做的就是向 NVIDIA 报告您的用户案例,看看他们是否可以提出解决方法,或提供例程的 "expert" 版本,其中调用者显式管理 scratch space。