cuBLAS中的主要维度是否允许访问任何子矩阵?

时间:2015-07-13 20:13:40

标签: cuda blas cublas

我试图理解cuBLAS中领先维度的想法。提到?assign必须始终大于或等于矩阵中的行数。

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

功能定义是:

*A

而且我也猜测在给定长度限制的情况下,我无法传输5x5矩阵的右下角3x3部分。

1 个答案:

答案 0 :(得分:3)

你必须像你所说的那样“调整*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