【发布时间】:2012-06-22 18:47:41
【问题描述】:
我是 CUDA 新手,我尝试使用 cuBlas 库为 QR 分解实现 Givens 旋转。
我用过
cublasStatus_t cublasSrotg(cublasHandle_t handle,
float *a, float *b,
float *c, float *s)
用于计算 c 和 s 和
cublasStatus_t cublasSrot (cublasHandle_t handle, int n,
float *x, int incx,
float *y, int incy,
const float *c, const float *s)
用于 1000 x 1000 矩阵的旋转。由于 cublaSrotg() 用 r 和 z 覆盖参数 a 和 b,我无法在设备内存中使用矩阵。但是将矩阵的元素复制到主机大约需要循环任何循环的 90%。 C 语言的实现速度快三倍。
我用错了吗?对于 CUDA 设备上的 Givens 轮换,什么是更好的选择?
提前致谢, 克里斯
【问题讨论】:
-
您在主机和设备之间复制时遇到性能问题,但您没有向我们展示任何执行复制的代码。您是否在主机上使用固定内存并且您是否在大批量执行副本?另外,您是如何测量时间的?您是否尝试在 CUDA 分析器中查看您的应用程序的时间线?
-
我遇到的问题与复制无关。函数 cublasSrotg 在计算 c 和 s 期间用中间数据覆盖 a 和 b。 (参见 CUDA Toolkit 4.1 CUBLAS 库,第 30 页)。所以我不能用指向我的初始矩阵a和b的指针来调用cublasSrotg。否则我必须再次将它们复制到初始矩阵中,以便使用 cublasSrot 进行计算。对吗?
-
我不敢相信这是正确的用法,因为它非常无效。