Некоторое время я просматривал, но не смог найти правильный ответ для этого:
Есть ли реализация для транспонирования диагональной матрицы на месте в CUDA?
Я в курсе Cublas Geam, но это требует создания другой матрицы. Я попробовал наивную реализацию из: Ошибка транспонирования на месте CUDA
Однако это работает только для квадратных матриц. Может кто-нибудь объяснить мне, почему именно эта логика не работает для диагональных матриц? «Наивный» подход к транспозиции работает, хотя, однако, он не на месте.
Посмотрев некоторое время, я нашел следующую страницу github, на которой есть код, связанный с исследовательской статьей nvidia для транспонирования на месте:
https://github.com/BryanCatanzaro/inplace
Это, кажется, правильный способ решить этот вопрос.
Посмотрите на следующую статью: Разложение для матричной транспозиции на месте
Последовательный алгоритм транспонирования матрицы на месте выглядит следующим образом (> 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]);
}
}