Внутренний оператор if убивает векторизацию

У меня есть следующее для цикла. Когда я включаю массив типов, код не векторизируется. Когда я фиксирую тип в ‘1’, gcc выполняет примитивную векторизацию. У кого-нибудь есть какие-либо рекомендации по запуску какой-то векторизации?

#define type(M,N) type[(M)*sizeX + (N)]
for (int i = 0; i < sizeY - 1; i++)
{
for (int j = 0; j < sizeX - 1; j++)
{
const int id = type(i, j);
//const int id = 1; //vectorizes
const float A = this->A[id];
const float B = this->B[id];
a(i, j) = A * a(i, j) + B * (b(i, j) - b(i + 1, j))*(p[i]);
}
}

Примерная ошибка из gcc 4.7.1

45: not vectorized: not suitable for gather A_26 = *D.14145_25;

Редактировать 1

Все массивы хранятся в виде указателей и определяются с помощью ограничивать Ключевое слово как члены некоторого класса.

Редактировать 2

Есть ли что-то, что я могу сделать, еслиtype‘ маленький?

Редактировать 3

Малые средства 8.

2

Решение

Разница в доступе к памяти.

когда id = 1следующие загрузки массива становятся одноэлементной векторной трансляцией.

 const float A = this->A[id];
const float B = this->B[id];

Но когда id = type[(i)*sizeX + (k)]доступ к памяти расширен (не смежен).

Векторные загрузки и сохранения в SSE и AVX могут быть выполнены только на:

  1. Смежные блоки памяти.
  2. Или из одного элемента, который транслируется на весь вектор.

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

AVX2 будет поддерживать такие инструкции «собрать / разбросать».


Для внесения изменений:

Если i в type(i, j) кроме нуля, доступ к памяти все еще ограничен. Так что будет сложно векторизовать. (Я говорю «трудно», а не «невозможно», потому что это возможно для очень маленьких шагов, определяемых временем компиляции — хотя и с пониженной эффективностью.)

Основная проблема, с которой вы столкнулись, заключается в том, что вы перебираете строки матрицы. Это не только не поддерживает векторизацию без поддержки сбора / разброса, но и плохо для кеша.

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

4

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

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

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