Привязка к концу при копировании массива - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь проанализировать алгоритм, и я хотел бы улучшить некоторые части. Теперь я обнаружил (в Intel VTUnes), что одна функция имеет внутреннюю привязку. Тело этой функции:

int i, j;

// copy original population to temporary area
for (i = 0; i < population_size; i++)
{
    for (j = 0; j < problem_size; j++)
    {
        ffa_tmp[i][j] = ffa[i][j];
    }
}

// generational selection in sense of EA
for (i = 0; i < population_size; i++)
{
    for (j = 0; j < problem_size; j++)
    {
        ffa[i][j] = ffa_tmp[Index[i]][j];
    }
}

ffa и ffa_tmp - динамически распределяемые двумерные массивы двойников. Index - массив целых чисел. Используется для заказа. Худшая часть по анализатору - ffa[i][j] = ffa_tmp[Index[i]][j];

Если я правильно понимаю, я мог бы улучшить это с помощью векторизации. Или есть другое решение?

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Векторизация, безусловно, путь к go, но с изюминкой C ++. динамически размещаемые двумерные массивы не являются двумерными массивами. Они представляют собой массив указателей на массивы. Они также могут быть жестоко и мучительно медленными из-за всех скачков в памяти, которые, вероятно, должен делать процессор. Это почти наверняка часть того, о чем вас предупреждает тюнер. Если вам нужно ускорить это, сначала посмотрите, можете ли вы использовать непрерывное хранилище данных для улучшения кэширования и уменьшения погони за указателями. Вот простой .

Далее идет fa[i][j] = ffa_tmp[Index[i]][j]];. В зависимости от того, как устроен Index[i]][j], ЦПУ, возможно, придется переходить назад и вперед через ffa_tmp в поисках индексированной записи. Современные процессоры работают наилучшим образом при доступе к данным, если они непрерывны и предсказуемы (см. Почему обработка отсортированного массива выполняется быстрее, чем обработка несортированного массива? ). Вы ничего не можете сделать, чтобы улучшить дружественность кеша. Если первое предложение не дает необходимого улучшения производительности, посмотрите, можете ли вы изменить дизайн, чтобы избежать необходимости выполнять эту индексацию полностью.

0 голосов
/ 31 января 2020

Вы можете улучшить этот код, используя memcpy .

...