gpt4 book ai didi

c++ - CUDA/CUBLAS : Accessing elements in an array

转载 作者:行者123 更新时间:2023-11-28 03:10:41 30 4
gpt4 key购买 nike

作为对上一个问题的跟进 here ,我正在尝试实现以下循环,这是一个矩阵 vector 乘法,其中 vector 是基于循环迭代器的矩阵 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 的解决方案正是我一直在寻找的。谢谢。

最佳答案

可以按照您建议的方式对扁平化的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 是相关列的连续元素之间的步幅(以元素为单位,而不是字节)。请注意,您编写的代码会覆盖一个矩阵 vector 与下一个矩阵 vector 相乘的结果,因为您没有通过 d_v 索引输出 vector 。所以我在 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);

如果您的代码没有按您预期的方式工作,请提供一个完整的、可编译的示例。

关于c++ - CUDA/CUBLAS : Accessing elements in an array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18573099/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com