Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于矩形矩阵转置的就地CUDA内核_C++_Matrix_Cuda_Transpose - Fatal编程技术网

C++ 用于矩形矩阵转置的就地CUDA内核

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

我已经仔细阅读了一段时间,但找不到正确的答案:

CUDA中是否有就地对角矩阵转置的实现

我知道cublas geam,但这需要创建另一个矩阵。我尝试了一个简单的实现:


然而,这只适用于平方矩阵。有人能给我解释一下为什么这个逻辑不适用于对角矩阵吗?“天真”的换位方法虽然有效,但还没有到位。

看看下面的文章:

就地矩阵转置的顺序算法如下(>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]);
    }
}