Оптимизация цикла с помощью компилятора IBM xlC с Altivec - PullRequest
1 голос
/ 16 сентября 2011

Я просто играл с расширением Altivec на кластере power6, который у нас есть. Я заметил, что когда я компилировал приведенный ниже код без каких-либо оптимизаций, мое ускорение составило 4, как я и ожидал. Однако, когда я снова скомпилировал его с флагом -O3, мне удалось получить ускорение до 60!

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

int main(void) {
        const int m = 1000;

        __vector signed int va;
        __vector signed int vb;
        __vector signed int vc;
        __vector signed int vd;

        int a[m];
        int b[m];
        int c[m];

        for( int i=0 ; i < m ; i++ ) {
                a[i] = i;
                b[i] = i;
                c[i] = 0;
        }

        for( int cnt = 0 ; cnt < 10000000 ; cnt++ ) {
                vd = (__vector signed int){cnt,cnt,cnt,cnt};

                for( int i = 0 ; i < m/4 ; i+=4 ) {
                        va = vec_ld(0, &a[i]);
                        vb = vec_ld(0, &b[i]);
                        vc = vec_add(vd, vec_add(va,vb));
                        vec_st(vc, 0, &c[i]);
                }
        }

        std::cout << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "\n";

        return 0;
}

1 Ответ

4 голосов
/ 16 сентября 2011

Я сделал кое-что о Power 7, и я видел очень странные вещи с компилятором XLC.Но не так странно, как это!(по крайней мере, не в 60 раз ...)

В серии PowerPC следует отметить одну вещь (по крайней мере, для Power6 и Power7): задержка команд очень велика, а выполнение вне очереди очень велико.слабый по сравнению с x86 / x64.

Следовательно, внутренний цикл (как написано в вашем коде) будет иметь очень низкий IPC.

Теперь я могу представить, что вы получаете 60-кратное ускорение.что внутренний цикл полностью развернут под -O3 .Это возможно, поскольку статический счетчик внутреннего цикла может быть определен как 63.

Развертывание этого внутреннего цикла в основном позволит заполнить весь конвейер.

Конечно, япросто угадаюЛучше всего посмотреть на сборку.

Кроме того, как вы рассчитываете это?Много странного поведения, которое я видел на PowerPC, связано с самими таймерами ...

РЕДАКТИРОВАТЬ:

Поскольку ваш пример кода довольно прост, его будет очень легко обнаружить (в сборке) независимо от того, частично или полностью развернут этот внутренний цикл.

...