2014-10-17 85 views
1

我已經仔細研讀了一段時間,但無法找到這個正確的答案:就地CUDA內核長方形矩陣轉置

是否有實現就地對角矩陣轉置的CUDA ?

我知道cublas geam,但這需要創建另一個矩陣。我嘗試了一個天真的執行:CUDA In-place Transpose Error

但是,這隻適用於矩陣矩陣。有人可以向我解釋爲什麼這個邏輯對於對角矩陣不起作用嗎?雖然「天真」換位的方法可行,但它不適用。

+4

你的對角矩陣是正方形還是矩形'm×n'矩陣,'m!= n'?由於平方對角矩陣是對稱的,因此我們假定它是後者,因此它們是它們自己的轉置矩陣。您是否可以指向一篇定義標準算法或基於CPU的參考庫的函數來執行矩陣對角矩陣的轉置? – njuffa 2014-10-18 02:14:16

+1

如果你真的想在O(1)空間就地完成它,請查看這個實現:http://www.careercup.com/question?id = 12339553(111這個人的第四個回答)。但這對於CUDA來說可能不是一個好的實現。你還檢查了這一個:https://research.nvidia.com/publication/decomposition-place-matrix-transposition – 2014-10-18 21:00:10

+0

njuffa:它們是矩形的,其中m!= n。我已經嘗試過可以在這裏查看的天真轉置實現:https://github.com/parallel-forall/code-samples/blob/master/series/cuda-cpp/transpose/transpose.cu – bge0 2014-10-20 17:10:27

回答

2

看一看以下紙張:A Decomposition for In-place Matrix Transposition

序貫算法用於就地矩陣轉置如下(> O(n * m個)運行時間):

// 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]); 
    } 
} 
+1

嗨,ASM,感謝您的論文鏈接。這是正確的解決方案,但是cpu代碼與問題無關。 – bge0 2014-10-26 18:21:20