Ответ 1
Компилятор не векторизует цикл, потому что он не может определить, что динамически выделенные указатели не псевдонимы друг друга. Простым способом, чтобы ваш код кода был векторизован, должен передать параметр --param vect-max-version-for-alias-checks=1000
. Это позволит компилятору исправить все проверки, необходимые, чтобы увидеть, действительно ли указатели наложены.
Еще одно простое решение, позволяющее использовать ваш примерный код для векторизации, - это переименовать main
, как предложил Марк Глисс в своем комментарии. Функции с именем main
, по-видимому, отключены. Именованный что-то еще, GCC 4.9.2 может отслеживать использование this->foo
(и других элементов указателя) в compute
обратно к их выделениям в Test()
.
Однако я предполагаю, что что-то другое, кроме вашего класса, которое используется в функции с именем main
, помешало вашему вектору векторизовать ваш реальный код. Более общее решение, которое позволяет векторизовать ваш код без проверки наложения или выравнивания, заключается в использовании ключевого слова restrict
и атрибута aligned
. Что-то вроде этого:
typedef float __attribute__((aligned(16))) float_a16;
__attribute__((noinline))
static void _compute(float_a16 * __restrict__ pos,
float_a16 * __restrict__ vel,
float_a16 * __restrict__ alpha,
float_a16 * __restrict__ k_inv,
float_a16 * __restrict__ osc_sin,
float_a16 * __restrict__ osc_cos,
float_a16 * __restrict__ dosc1,
float_a16 * __restrict__ dosc2,
int size) {
for (int i=0; i<size; i++){
float lambda = .67891*k_inv[i],
omega = (.89 - 2*alpha[i]*lambda)*k_inv[i],
diff2 = pos[i] - omega,
diff1 = vel[i] - lambda + alpha[i]*diff2;
pos[i] = osc_sin[i]*diff1 + osc_cos[i]*diff2 + lambda*.008 + omega;
vel[i] = dosc1[i]*diff1 - dosc2[i]*diff2 + lambda;
}
}
void compute() {
_compute(pos, vel, alpha, k_inv, osc_sin, osc_cos, dosc1, dosc2,
size);
}
Атрибут noinline
является критическим, иначе вложение может привести к тому, что указатели потеряют свою ограниченность и согласованность. Компилятор, похоже, игнорирует ключевое слово restrict
в контексте, отличном от параметров функции.