Ядро CUDA на месте для прямоугольной транспонированной матрицы

Некоторое время я просматривал, но не смог найти правильный ответ для этого:

Есть ли реализация для транспонирования диагональной матрицы на месте в CUDA?

Я в курсе Cublas Geam, но это требует создания другой матрицы. Я попробовал наивную реализацию из: Ошибка транспонирования на месте CUDA

Однако это работает только для квадратных матриц. Может кто-нибудь объяснить мне, почему именно эта логика не работает для диагональных матриц? «Наивный» подход к транспозиции работает, хотя, однако, он не на месте.

1

Решение

Посмотрев некоторое время, я нашел следующую страницу github, на которой есть код, связанный с исследовательской статьей nvidia для транспонирования на месте:

https://github.com/BryanCatanzaro/inplace

Это, кажется, правильный способ решить этот вопрос.

3

Другие решения

Посмотрите на следующую статью: Разложение для матричной транспозиции на месте

Последовательный алгоритм транспонирования матрицы на месте выглядит следующим образом (> 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]);
}
}
2

По вопросам рекламы [email protected]