У меня есть следующее для цикла. Когда я включаю массив типов, код не векторизируется. Когда я фиксирую тип в ‘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.
Разница в доступе к памяти.
когда id = 1
следующие загрузки массива становятся одноэлементной векторной трансляцией.
const float A = this->A[id];
const float B = this->B[id];
Но когда id = type[(i)*sizeX + (k)]
доступ к памяти расширен (не смежен).
Векторные загрузки и сохранения в SSE и AVX могут быть выполнены только на:
Они не могут обрабатывать пошаговый доступ к памяти, когда вы загружаете каждый из векторных элементов из разных частей памяти.
AVX2 будет поддерживать такие инструкции «собрать / разбросать».
Для внесения изменений:
Если i
в type(i, j)
кроме нуля, доступ к памяти все еще ограничен. Так что будет сложно векторизовать. (Я говорю «трудно», а не «невозможно», потому что это возможно для очень маленьких шагов, определяемых временем компиляции — хотя и с пониженной эффективностью.)
Основная проблема, с которой вы столкнулись, заключается в том, что вы перебираете строки матрицы. Это не только не поддерживает векторизацию без поддержки сбора / разброса, но и плохо для кеша.
Я не уверен, какую задачу вы пытаетесь выполнить, но вам, возможно, придется рассмотреть другой макет данных, чтобы получить максимальную производительность.
Других решений пока нет …