матрица — C ++ Избегайте «ложного обмена» в OpenMP

Я пытаюсь распараллелить некоторые итерации по матрице.

Матрица сохраняется в одномерном массиве, чтобы иметь непрерывные данные в памяти:

// array that contains all the elems of dense matrix
char* data;
//set of pointers to the matrix rows indexed by the subarrays of 'data'
char ** dense = NULL;
dense = new char*[m_rows];
data = new char[m_cols*m_rows];

После того, как «данные» заполнены числами, я индексирую матрицу таким образом:

// index every row of DENSE with a subarray of DATA
char* index = data;
for(int i = 0; i < m_rows; i++)
{
dense[i] = index;
// index now points to the next row
index += m_cols;
}

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

    int th_id;
#pragma omp parallel for private(i, th_id) schedule(static)
for(j=0;j<m_cols;++j)
{
for(i=0;i<m_rows;++i)
{
if(dense[i][j] == 1)
{
if(i!=m_rows-1)
{
if(dense[i+1][j] == 0)
{
dense[i][j] = 0;
dense[i+1][j] = 1;
i++;
}
}
else
{
if(dense[0][j] == 0)
{
dense[i][j] = 0;
dense[0][j] = 1;
}
}
}
}
}

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

Как я могу решить эту проблему?

0

Решение

Задача ещё не решена.

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector