прагма выравнивания памяти gcc

Делает 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);
        }

Спасибо

8
задан Anycorn 21 April 2010 в 23:50
поделиться

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

10
ответ дан 5 December 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: