【问题标题】:Does the leading dimension in cuBLAS allow for accessing any submatrix?cuBLAS 中的前导维度是否允许访问任何子矩阵?
【发布时间】:2015-10-02 06:14:54
【问题描述】:

我试图理解 cuBLAS 中领先维度的概念。提到lda 必须始终大于或等于矩阵中的行数。

如果我有一个 100x100 的矩阵 A,我想访问 A(90:99, 0:99),cublasSetMatrix 的参数是什么? lda 指定同一列中元素之间的行数(在本例中为 100),但我将在哪里指定 90?我只能通过调整*A看到方法。

函数定义为:

cublasStatus_t cublasSetMatrix(int rows, int cols, int elemSize, const void *A, int lda, void *B, int ldb)

而且我还猜测,鉴于长度限制,我将无法传输 5x5 矩阵的右下角 3x3 部分。

【问题讨论】:

  • 答案取决于矩阵的存储顺序。 A以哪种方式存储?
  • @talonmies 列专业
  • 是的,您可以使用 CUBLAS(或任何 BLAS,就此而言)访问任意子矩阵。请解码您的符号。 A(90:99, 0:99) = 第 90 行到第 0 行的第 99 列?为什么以相反的顺序指定行?
  • 我自己也很困惑。我的意思是 90-99 列,每列有 100 行,索引为 0-99。

标签: cuda blas cublas


【解决方案1】:

您必须像您所说的那样“调整*A”。提供给此函数的指针必须是相应子矩阵的起始条目。

您没有说您的矩阵 A 实际上是输入矩阵还是输出矩阵,但这在概念上应该不会有太大变化。

假设你有以下代码:

// The matrix in host memory
int rowsA = 100;
int colsA = 100;
float *A = new float[rowsA*colsA];

// Fill A with values
...

// The sub-matrix that should be copied to the device.
// The minimum index is INCLUSIVE
// The maximum index is EXCLUSIVE
int minRowA = 0;
int maxRowA = 100;
int minColA = 90;
int maxColA = 100;
int rowsB = maxRowA-minRowA;
int colsB = maxColA-minColA;

// Allocate the device matrix
float *dB = nullptr;
cudaMalloc(&dB, rowsB * colsB * sizeof(float));

然后,对于cublasSetMatrix 调用,您必须计算源矩阵的起始元素:

float *sourceA = A + (minRowA + minColA * rowsA);
cublasSetMatrix(rowsB, colsB, sizeof(float), sourceA, rowsA, dB, rowsB);

这就是您要求的90 发挥作用的地方:它是源指针计算中的minColA

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2012-09-04
    • 2013-04-28
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    相关资源
    最近更新 更多