【问题标题】:How can I copy a strided matrix in BLAS?如何在 BLAS 中复制跨步矩阵?
【发布时间】:2019-09-16 20:06:12
【问题描述】:

据我所知,BLAS 3 级矩阵/矩阵例程采用参数ldaldb 等,允许通过“跨步”矩阵。例如,如果我有以下 2 x 2 列主矩阵:

|1 2|
|3 4|
|x x|

其中 x 是我想要忽略的数据,我可以使用参数 m = 2, n = 2, lda=3 来表示它(对于列主矩阵)。 我的问题是,可以使用 BLAS 例程复制这样的矩阵吗?

如果步幅等于矩阵维数(即矩阵没有步幅),则使用 vector copy 过程很简单,例如dcopy(m*n,A,1,B,1) 这样做。 当矩阵元素不连续时有没有办法做到这一点,即 lda/stride != m

我能想到的一种方法是重复调用dcopy 并增加偏移量,同时保持incrx 参数等于m。似乎效率不高。或者dgemm B = I 和 C = 0。

【问题讨论】:

    标签: matrix memcpy blas cblas


    【解决方案1】:

    请查看此文档:

    http://www.netlib.org/lapack/explore-3.1.1-html/slacpy.f.html

    SLACPY( UPLO, M, N, A, LDA, B, LDB )
    

    例如,对于从 A 的全部或部分到 B 的单精度实矩阵,上述内容可以满足您的需求。它的使用相当严格。当然,您会发现所有风味 D、C、Z 的实现

    【讨论】:

    • 我已经接受了答案,尽管令人费解的是这是在 LAPACK 而不是 BLAS 中。 BLAS 中似乎没有等价物。
    • 首先谢谢。但现在你要说的是:xLACPY 确实是 LAPACK 的一部分。原因是它们是由 LAPACK 程序员编写的,是 LAPACK 辅助例程。据我所知,xLACPY 被编码以帮助 xHSEQR 分解驱动程序。有一个关于将这些例程移动到较低级别包的讨论。但到目前为止,这仍然是一个讨论。
    • 是的,在BLAST forum spec p. 2 它说 许多新操作都基于 LAPACK 中的辅助例程(例如 ... GE_COPY)。只有在 LAPACK 项目开始之后,它才意识到有像矩阵复制例程(GE_COPY)这样的操作......这种操作经常发生,因此为它们制作单独的例程是明智的。但看起来这个规范不是与当前的 ref BLAS 实现相同。我很困惑,因为我找不到 GE_COPY。现在这是有道理的。
    • 值得一提的是,SLACPY 在跨步三角矩阵上运行。即不确定它在包装或带状存储中如何工作。
    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多