0

作为对上一个问题的跟进,我正在尝试实现以下循环,这是一个矩阵向量乘法,其中向量是矩阵 Q 的列,基于循环迭代器:

编辑:Q 不能事先填充,而是用迭代器 K 的进展填充。

for (unsigned K=0;K<N;K++){   // Number of iterations loop
    //... do some stuff
    for (unsigned i=0; i<N; i++){
        float sum = 0;
        for (unsigned j=0; j<N; j++){
            sum += A[j][i]*Q[j][K];
        }
        v[i] = sum;
    }
    //... do some stuff
    // populate next column of Q
}

数组的维度是:

一个 [N x N]

Q [N x (0.5N + 1)]

该数组已被展平,以便与 cublasSgemv() 一起使用。我的问题是,是否可以通过告诉它从哪里开始访问 d_Q 以及元素的增量是多少(因为它是行主要 C++)来使用 cublasSgemv():

编辑:将内存访问增量与 sizeof(float) 相乘。据我所知,仍然不起作用。

Niter = 0.5*N + 1;
for (unsigned K=0;K<N;K++){
    cublasSgemv(handle, CUBLAS_OP_T, N, N, &alpha, d_A, N, (d_Q + sizeof(float)*K*(Niter)), (Niter), &beta, d_v , 1);
}

我认为不可能像那样索引 d_Q,因为我没有得到任何结果

已解决:@RobertCrovella 的解决方案正是我想要的。谢谢。

4

1 回答 1

2

Q可以按照您建议的方式对您的展平矩阵进行索引。您对Sgemv的调用应如下所示:

cublasSgemv(handle, CUBLAS_OP_T, N, N, &alpha, d_A, N, (d_Q + K), (Niter), &beta, (d_v+(K*Niter)) , 1);

指向的指针Q应该指向相关列的第一个元素,并且由于您的矩阵是行优先的,所以这只是d_Q + K(使用指针算术,而不是字节算术)。 Niter是相关列的连续元素之间的步幅(以元素为单位,而不是字节)。请注意,您编写的代码将覆盖一个矩阵向量乘以下一个的结果,因为您没有通过d_v输出向量进行索引。所以我在d_v.

正如@JackOLantern 指出的那样,也应该可以在没有循环的情况下通过调用Sgemm 一步完成

cublasSgemm(handle, CUBLAS_OP_T, CUBLAS_OP_T N, Niter,  N, &alpha, d_A, N, d_Q, (Niter), &beta, d_v, N);

如果您的代码没有按照您期望的方式运行,请提供一个完整的、可编译的示例。

于 2013-09-02T13:14:34.060 回答