Разложение эффективной матрицы на квадратные подматрицы в C ++ - PullRequest
4 голосов
/ 17 февраля 2011

Я реализовал тип данных Matrix в C ++, используя 1D-тип данных и упаковывая его в строки и столбцы. Теперь я хочу иметь возможность создавать квадратные / заблокированные подматрицы с этого времени, и я хочу сделать это в памяти.

Проблема в том, что я хочу, чтобы некоторые из этих подматриц были перенесены в память графического процессора и могли обрабатывать их там параллельно. Это, например, полезно для умножения матриц. Поскольку эти подматрицы не выровнены в основной памяти, копирование их в память устройства как единое целое выглядит невозможным без создания отдельной копии? Я хочу иметь это прямое отображение подматрицы графического процессора в матрицу исходного процессора для обновления и повышения эффективности. Я не знаю о точном разбиении заранее.

У кого-нибудь есть идеи, как мне этого достичь?

Просто напоминание, матрица должна быть разбита на блоки, а не по строкам, что будет относительно просто в C / C ++.

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Если необходимые подматрицы известны во время создания «мастер» матрицы, и если они образуют раздел мастера, можно создать класс составной матрицы примерно так:

// supposing an IMatrix<T> interface (pure virtual members only) class

template< typename T >
struct CompositeMatrix : public IMatrix<T> {
   typedef std::vector<PlainMatrix<T>*> tMatrices;

   tMatrices submatrices;
   T& element( size_t row, size_t column ) {
       return findsubmatrix( row, column )->element( row, column );
   }

   // find algorithm implementing 'chain of responsibility-like' pattern.
   PlainMatrix<T>* findsubmatrix( size_t row, size_t col ) {
     for( tMatrices::iterator it = submatrices.begin()
        ; it != submatrices.end()
        ; ++it)
     {
        if( it->contains( row,col ) ) return *it;            
     }
     return NULL;
   }
};

PlainMatix может быть организован с эффективным использованием памяти.

0 голосов
/ 23 февраля 2011

Если размеры ваших матриц имеют степени 2, вы можете сохранить их в памяти хоста в z-порядке .Таким образом, вам просто нужен начальный и конечный индексы подматрицы, чтобы скопировать ее одним вызовом cudaMemcpy.

...