Делает gcc, имеют прагму выравнивания памяти, сродни #pragma vector aligned
в компиляторе Intel? Я хотел бы сказать компилятору оптимизировать конкретный цикл с помощью выровненных инструкций по загрузкам/хранилищу. для предотвращения возможного беспорядка это не об упаковке структуры.
например:
#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
for (int a = 0; a < int(N); ++a) {
q10 += Ix(a,0,0)*Iy(a,1,1)*Iz(a,0,0);
q11 += Ix(a,0,0)*Iy(a,0,1)*Iz(a,1,0);
q12 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,0,1);
q13 += Ix(a,1,0)*Iy(a,0,0)*Iz(a,0,1);
q14 += Ix(a,0,0)*Iy(a,1,0)*Iz(a,0,1);
q15 += Ix(a,0,0)*Iy(a,0,0)*Iz(a,1,1);
}
Спасибо
Вы можете сообщить GCC, что указатель указывает на выровненную память, используя typedef для создания чрезмерно выровненного типа, на который вы можете объявить указатели.
Это помогает gcc, но не clang7.0 или ICC19, см. Не-AVX asm x86-64, которые они генерируют на Godbolt . (Только GCC складывает загрузку в операнд памяти для mulps
вместо использования отдельного movups
). Вы должны использовать __ builtin_assume_aligned
, если хотите переносимо передать обещание выравнивания компиляторам GNU C, кроме самого GCC.
Из http://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
typedef double aligned_double __attribute__((aligned (16)));
// Note: sizeof(aligned_double) is 8, not 16
void some_function(aligned_double *x, aligned_double *y, int n)
{
for (int i = 0; i < n; ++i) {
// math!
}
}
Это не сделает align_double
шириной 16 байт. Это просто выровняет его по 16-байтовой границе, или, скорее, будет первой в массиве. Глядя на разборку на моем компьютере, как только я использую директиву alignment, я начинаю видеть МНОГО векторных операций. В настоящее время я использую компьютер с архитектурой Power, так что это код altivec, но я думаю, что он делает то, что вы хотите.
(Примечание: я не использовал double
, когда тестировал это, потому что altivec не поддерживает двойные числа с плавающей запятой.)
Вы можете увидеть некоторые другие примеры автовекторизации с использованием атрибутов типа здесь : http://gcc.gnu.org/projects/tree-ssa/vectorization.html