【问题标题】:Givens rotation for QR decomposition with cuBlas functions cublasSrotg and cublasSrot使用 cuBlas 函数 cublasSrotg 和 cublasSrot 进行 QR 分解的 Givens 旋转
【发布时间】: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 进行计算。对吗?
  • 我不敢相信这是正确的用法,因为它非常无效。

标签: cuda gpgpu nvidia cublas


【解决方案1】:

我找不到在同一个矩阵上多次执行cublasSrotgcublasSrot 的技巧,所以我实现了自己的内核。

同时使用rhypot 有一种更简单的方法,性能更高

double t = rhypot(x, y);
double c = x * t;
double s = y * t;

CUDA Devblog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2015-10-15
    • 2016-08-06
    • 1970-01-01
    • 2017-03-08
    • 2014-04-11
    • 2013-11-01
    相关资源
    最近更新 更多