首先,在cublas的官方文档中有强调,如果不设置流,那么cublas将使用默认流,即 NULL 流; 但是cusolver的文档中没有强调这个事儿,但是,其实cusolver底层是cublas和cusparse,而且cusolver会把自己的流同时设置给cublas,所以,既然cublas在这种情况下使用了NULL流,那么可以期待cusolver也使用了 NULL 流。
但还是稍微测试一下为好。
cusolverDnCreate之后,如果不调用 cusolverSetStream,那么,cusolver的这个handle是否可以被正常使用来调用cusolver的Math API 呢?
1,不设置时会Get到 NULL stream
测试源码
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <cusolverDn.h>
int main()
{
cusolverDnHandle_t handle;
cublasHandle_t cublasHandle;
cudaStream_t stream;
cusolverDnCreate(&handle);
cublasCreate(&cublasHandle);
//cudaStreamCreate(&stream);
//LL::cusolverDnSetStream(handle, stream);
//LL::cublasSetStream(cublasHandle, stream);
cudaStream_t blas_stream;
cublasGetStream(cublasHandle, &blas_stream);
printf("blas_stream = %p\n", blas_stream);
cudaStream_t solver_stream;
cusolverDnGetStream(handle, &solver_stream);
printf("solver_stream = %p\n", solver_stream);
return 0;
}
编译命令:
$ g++ hello.cpp -I /usr/local/cuda/include -L /usr/local/cuda/lib64 -lcudart -lcublas -l cusolver
运行效果:
结论:
Get到的stream都是NULL指针,即,cublas和cusolver都会使用默认stream;
2,cusolver在不设置stream时能正常工作
测试源代码:
将上述示例中的SetStream的两行注释掉,依然可以正常工作:
没有注释掉Set效果图:
没注释掉Set的运行结果:
注释掉了Set效果图:
注释掉Set的效果图:
不注释时,stream指针非0,
注释掉时,stream指针为0;
但计算结果和运行时间结果完全一致;