将 cublasHandle_t 传递给用户函数时出现问题

问题描述 投票:0回答:1

我正在使用 CUDA 并行化特定的谱聚类算法,并且遇到了一个奇怪的错误。在这个阶段,我仍在测试我打算并行化的每个单独步骤是否返回与其 CPU 对应部分相同的结果,因此我将代码划分为多个测试函数,同时测量它们的性能和执行时间。

由于我也使用 cuBLAS,因此我想为对库的所有调用创建一个全局

cublasHandle_t
(CPU 上只有一个线程执行代码,因此它将是线程安全的),因为我想消除开销创建和销毁每个测试单元的句柄。由于某种原因,当我调用
cublasCreate()
outside 测试函数并将其传递给函数本身时,我得到的结果不正确。但是,如果我在测试函数内部创建并销毁它,那么它就可以正常工作。代码片段如下: cublasCreate(&handle); test_calculate_affinity_matrix(A_11_cu, Z, mu); // Calls cublas functions, handle arg is cublasHandle_t type test_calculate_m_star(A_11_cu, M_star_cu, handle); cublasDestroy(handle);

当我检查 cuBLAS 文档时,我找不到任何关于将 
cublasHandle_t

传递给其他用户函数的限制,尽管在示例代码中我注意到,当他们这样做时,他们将其传递给的函数定义为

inline 
函数,所以没有真正进行调用。有人可以向我解释为什么会出现这种情况以及
cublasCreate()
在后台实际上做了什么吗?

编辑:

我尝试按照我的想法重新创建错误(将 cublasHandle_t 传递给用户函数),但事实证明这可能不是这里的问题。但是,如果我将

cublasCreate(&handle)
调用移到上面代码片段中的第一个测试函数之后,那么它就可以正常工作。代码已经相当大了,所以我现在不知道如何使其紧凑并重新创建错误,但其中有 cuda 内存分配调用和对我编写的内核的两次调用,以及一些时间测量函数。目前不确定为什么这会成为一个问题。
    

cuda cublas
1个回答
0
投票
cublasHandle_t

时,内存似乎被设置为零,但是当我在 cuBLAS 调用之前有另一个内核时,内存中仍然有垃圾。所以我只需要小心调用 cudaMemset 来初始化内存即可。

    

© www.soinside.com 2019 - 2024. All rights reserved.