我试图理解cuBLAS中领先维度的想法。提到?assign
必须始终大于或等于矩阵中的行数。
如果我有100x100矩阵A并且我想访问A(90:99,0:99),那么lda
的参数是什么? cublasSetMatrix
指定同一列中元素之间的行数(在本例中为100),但是在哪里指定90?我只能通过调整lda
来找到方法。
功能定义是:
*A
而且我也猜测在给定长度限制的情况下,我无法传输5x5矩阵的右下角3x3部分。
答案 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
。