我已經仔細研讀了一段時間,但無法找到這個正確的答案:就地CUDA內核長方形矩陣轉置
是否有實現就地對角矩陣轉置的CUDA ?
我知道cublas geam,但這需要創建另一個矩陣。我嘗試了一個天真的執行:CUDA In-place Transpose Error
但是,這隻適用於矩陣矩陣。有人可以向我解釋爲什麼這個邏輯對於對角矩陣不起作用嗎?雖然「天真」換位的方法可行,但它不適用。
我已經仔細研讀了一段時間,但無法找到這個正確的答案:就地CUDA內核長方形矩陣轉置
是否有實現就地對角矩陣轉置的CUDA ?
我知道cublas geam,但這需要創建另一個矩陣。我嘗試了一個天真的執行:CUDA In-place Transpose Error
但是,這隻適用於矩陣矩陣。有人可以向我解釋爲什麼這個邏輯對於對角矩陣不起作用嗎?雖然「天真」換位的方法可行,但它不適用。
環視後一會我發現下面的GitHub的頁面裏面確實有相關的NVIDIA研究論文就地轉碼:
https://github.com/BryanCatanzaro/inplace
這似乎是解決此問題的正確方法。
看一看以下紙張: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]);
}
}
嗨,ASM,感謝您的論文鏈接。這是正確的解決方案,但是cpu代碼與問題無關。 – bge0 2014-10-26 18:21:20
你的對角矩陣是正方形還是矩形'm×n'矩陣,'m!= n'?由於平方對角矩陣是對稱的,因此我們假定它是後者,因此它們是它們自己的轉置矩陣。您是否可以指向一篇定義標準算法或基於CPU的參考庫的函數來執行矩陣對角矩陣的轉置? – njuffa 2014-10-18 02:14:16
如果你真的想在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
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