Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Транспонировать матрицу, разбив на блоки

#c #матрицы #преобразование


Требуется ускорить транспонирование большой матрицы, элементы размещены в памяти
последовательно.
Ускорить нужно за счет обработки матрицы блоками, чтобы из кэша необходимые куски
памяти не успевали стираться.

Проблема возникла в написании кода самого транспонирования - выполнение затыкается
и ничего не работает.
Ниже сам кусок кода

void transposematrixblocked(int **src, int **dst, int size) {
  for (int i = 0; i < size; i + BLOCKSIZE) {
    for (int j = 0; j < size; j + BLOCKSIZE) {
      for (int ini = 0; ini < BLOCKSIZE; ini ++) {
        for (int inj = 0; inj < BLOCKSIZE; inj ++) {
            dst[i+ini][j+inj] = src[j+inj][i+ini];
        }
      }
    }
  }
}


где я оплошала и как сделать правильно?
    


Ответы

Ответ 1



В цикле for 3-й параметр должен быть вида i += BLOCKSIZE void transposematrixblocked(int **src, int **dst, int size) { for (int i = 0; i < size; i += BLOCKSIZE) { for (int j = 0; j < size; j += BLOCKSIZE) { for (int ini = 0; ini < BLOCKSIZE; ini ++) { for (int inj = 0; inj < BLOCKSIZE; inj ++) { dst[i+ini][j+inj] = src[j+inj][i+ini]; } } } } }

Ответ 2



Основная ошибка действительно была в синтаксисе - i + BLOCKSIZE, вместо i += BLOCKSIZE. Итоговый работающий код ниже: /* Transpose the blocked square matrix src and put the result in dst */ void transposematrixblocked(int **src, int **dst, int size) { for (int i = 0; i < size; i += BLOCKSIZE) { for (int j = 0; j < size; j += BLOCKSIZE) { for (int ini = i; ini < i + BLOCKSIZE; ini ++) { for (int inj = j; inj < j + BLOCKSIZE; inj ++) { dst[ini][inj] = src[inj][ini]; } } } }

Комментариев нет:

Отправить комментарий