如何通过 cublasCreate() 减少巨大的时间成本(10 秒)?
How to reduce the huge time cost (10 seconds) by cublasCreate()?
我正在使用 cuSPARSE_v2/cuBLAS_v2 库实现共轭梯度 (CG) 求解器,以处理我研究中的大型稀疏矩阵。我观察到的奇怪事情是 cublasCreate() 函数耗费了大量时间,大约 10 秒。我知道库初始化成本通常很大,但通过搜索论坛我发现 cublasCreate 通常的时间成本约为 100 毫秒,而不是 10 秒。而整个CG迭代部分只需要0.6~1秒。我还使用 CUSP 库实现了 CG 解算器,它表现得很好——总代码时间约为 0.5 秒。
那么如何通过cublasCreate()来降低时间成本呢?此外,如果大到 10s 是 cuda 库初始化的必备条件,为什么 CUSP 库的性能要好得多,而且初始化成本几乎可以忽略不计?
我在 GTX 980 Ti 上使用 CUDA-7.5。这是我的时间代码片段:
// Timing begin
struct timeval begin, end;
gettimeofday(&begin, 0);
cublasStatus = cublasCreate(&cublasHandle);
// Timing end
gettimeofday(&end, 0);
float cgtime = (end.tv_sec - begin.tv_sec) * 1000.0 + (end.tv_usec - begin.tv_usec) / 1000.0;
printf("\nTime elapse: %f ms.\n", cgtime);
非常感谢!
我终于找到原因了——我们的主服务器节点运行不正常,无法正常与GPU节点通信,不知何故导致cuBLAS库的动态链接受阻。重新启动恢复了所有。
所以此时cublasCreate()没有问题。我 post 在这里作为答案,以防有人遇到类似情况(尽管概率很低)。
我正在使用 cuSPARSE_v2/cuBLAS_v2 库实现共轭梯度 (CG) 求解器,以处理我研究中的大型稀疏矩阵。我观察到的奇怪事情是 cublasCreate() 函数耗费了大量时间,大约 10 秒。我知道库初始化成本通常很大,但通过搜索论坛我发现 cublasCreate 通常的时间成本约为 100 毫秒,而不是 10 秒。而整个CG迭代部分只需要0.6~1秒。我还使用 CUSP 库实现了 CG 解算器,它表现得很好——总代码时间约为 0.5 秒。
那么如何通过cublasCreate()来降低时间成本呢?此外,如果大到 10s 是 cuda 库初始化的必备条件,为什么 CUSP 库的性能要好得多,而且初始化成本几乎可以忽略不计?
我在 GTX 980 Ti 上使用 CUDA-7.5。这是我的时间代码片段:
// Timing begin
struct timeval begin, end;
gettimeofday(&begin, 0);
cublasStatus = cublasCreate(&cublasHandle);
// Timing end
gettimeofday(&end, 0);
float cgtime = (end.tv_sec - begin.tv_sec) * 1000.0 + (end.tv_usec - begin.tv_usec) / 1000.0;
printf("\nTime elapse: %f ms.\n", cgtime);
非常感谢!
我终于找到原因了——我们的主服务器节点运行不正常,无法正常与GPU节点通信,不知何故导致cuBLAS库的动态链接受阻。重新启动恢复了所有。
所以此时cublasCreate()没有问题。我 post 在这里作为答案,以防有人遇到类似情况(尽管概率很低)。