C++ 用于矩形矩阵转置的就地CUDA内核
我已经仔细阅读了一段时间,但找不到正确的答案: CUDA中是否有就地对角矩阵转置的实现 我知道cublas geam,但这需要创建另一个矩阵。我尝试了一个简单的实现:C++ 用于矩形矩阵转置的就地CUDA内核,c++,matrix,cuda,transpose,C++,Matrix,Cuda,Transpose,我已经仔细阅读了一段时间,但找不到正确的答案: CUDA中是否有就地对角矩阵转置的实现 我知道cublas geam,但这需要创建另一个矩阵。我尝试了一个简单的实现: 然而,这只适用于平方矩阵。有人能给我解释一下为什么这个逻辑不适用于对角矩阵吗?“天真”的换位方法虽然有效,但还没有到位。看看下面的文章: 就地矩阵转置的顺序算法如下(>O(n*m)运行时间): //在:n行中;m科尔斯 //输出:n cols;m行 无效矩阵_转置(int*a,int n,int m){ int i,j; 对于(i
然而,这只适用于平方矩阵。有人能给我解释一下为什么这个逻辑不适用于对角矩阵吗?“天真”的换位方法虽然有效,但还没有到位。看看下面的文章: 就地矩阵转置的顺序算法如下(>O(n*m)运行时间):
//在:n行中;m科尔斯
//输出:n cols;m行
无效矩阵_转置(int*a,int n,int m){
int i,j;
对于(int k=0;k
看看下面的文章:
就地矩阵转置的顺序算法如下(>O(n*m)运行时间):
//在:n行中;m科尔斯
//输出:n cols;m行
无效矩阵_转置(int*a,int n,int m){
int i,j;
对于(int k=0;k > p>在浏览了一会儿之后,我发现下面的GITHUB页面上有与英伟达研究论文相关的代码,用于本地化转置:
这似乎是解决这个问题的正确方法。
< P>在浏览了一会儿之后,我发现下面的GITHUB页面上有与英伟达研究论文相关的代码,用于就地转置:
这似乎是解决这个问题的正确方法。你的对角矩阵是正方形还是矩形mxn
矩阵,m!=n
?我假设它是后者,因为平方对角矩阵是对称的,因此它们有自己的转置。你能指出一篇论文定义了一个标准算法或一个基于CPU的参考库中的函数,该库执行矩形对角矩阵的换位吗?如果你真的想在O(1)空间中实现它,请查看这个实现:(第四个答案是111)。但这对CUDA来说可能不是一个好的建议。你也检查过这个:njuffa:它们是矩形的,其中m!=N我尝试过朴素的转置实现,这里可以回顾一下:谢谢asm。我将尝试实现论文中的逻辑。@bge0:我将论文的链接添加到答案中,以便其他人可以轻松找到它。如果它是对角矩阵正方形或矩形mxn
矩阵,m!=n
?我假设它是后者,因为平方对角矩阵是对称的,因此它们有自己的转置。你能指出一篇论文定义了一个标准算法或一个基于CPU的参考库中的函数,该库执行矩形对角矩阵的换位吗?如果你真的想在O(1)空间中实现它,请查看这个实现:(第四个答案是111)。但这对CUDA来说可能不是一个好的建议。你也检查过这个:njuffa:它们是矩形的,其中m!=N我尝试过朴素的转置实现,这里可以回顾一下:谢谢asm。我将尝试实现论文中的逻辑。@bge0:我将论文的链接添加到答案中,以便其他人可以轻松找到它。你可以接受它,如果它有帮助,谢谢链接到该文件。这是正确的解决方案,但是cpu代码与问题无关。嗨,ASM,感谢您提供本文的链接。这是正确的解决方案,但是cpu代码与问题无关。
// in: n rows; m cols
// out: n cols; m rows
void matrix_transpose(int *a, int n, int m) {
int i, j;
for(int k = 0; k < n*m; k++) {
int idx = k;
do { // calculate index in the original array
idx = (idx % n) * m + (idx / n);
} while(idx < k); // make sure we don't swap elements twice
std::swap(a[k], a[idx]);
}
}