реклама на сайте
подробности

 
 
> Развернуть цикл, GCC
Qwertty
сообщение Dec 23 2009, 13:45
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Нужно развернуть цикл принудительно. Опция -O3 эффекта не дала. Документация посоветовала -funroll-all-loops, но тоже не сработало. laughing.gif
Какое заклинание нужно применять?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
klen
сообщение Dec 23 2009, 18:59
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



для начала он должен быть разворачивыймым
тоесть число итерацй известно на этапе компиляции
иначе непонятно сколько его разворачивать
Go to the top of the page
 
+Quote Post
ReAl
сообщение Dec 23 2009, 20:54
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(klen @ Dec 23 2009, 20:59) *
для начала он должен быть разворачивыймым
тоесть число итерацй известно на этапе компиляции иначе непонятно сколько его разворачивать
Да если захочет, то и такие разворачивает. Берёт какое-то число операций для тела - чтобы не одну, сначала выбирает остаток, потом гонит цикл с этим числом.

Код
extern unsigned arr[];

void foo(unsigned cnt)
{
    unsigned i;
    for(i=0;i<cnt;++i)
        arr[i] = i;
}

gcc -O3 -funroll-all-loops
Код
    .file    "c.c"
    .text
    .p2align 4,,15
.globl _foo
    .def    _foo;    .scl    2;    .type    32;    .endef
_foo:
    pushl    %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %ecx
    testl    %ecx, %ecx
    je    L7
    xorl    %edx, %edx
    leal    -1(%ecx), %eax
    andl    $7, %eax
    movl    %edx, _arr
    movl    $1, %edx
    cmpl    %ecx, %edx
    jae    L7
    testl    %eax, %eax
    je    L8
    cmpl    $1, %eax
    je    L35
    cmpl    $2, %eax
    je    L36
    cmpl    $3, %eax
    je    L37
    cmpl    $4, %eax
    je    L38
    cmpl    $5, %eax
    je    L39
    cmpl    $6, %eax
    je    L40
    movl    $1, %eax
    movl    $2, %edx
    movl    %eax, _arr+4
L40:
    movl    %edx, _arr(,%edx,4)
    incl    %edx
L39:
    movl    %edx, _arr(,%edx,4)
    incl    %edx
L38:
    movl    %edx, _arr(,%edx,4)
    incl    %edx
L37:
    movl    %edx, _arr(,%edx,4)
    incl    %edx
L36:
    movl    %edx, _arr(,%edx,4)
    incl    %edx
L35:
    movl    %edx, _arr(,%edx,4)
    incl    %edx
    cmpl    %ecx, %edx
    jae    L7
L8:
    movl    %edx, _arr(,%edx,4)
    leal    1(%edx), %eax
    movl    %eax, _arr(,%eax,4)
    leal    2(%edx), %eax
    movl    %eax, _arr(,%eax,4)
    leal    3(%edx), %eax
    movl    %eax, _arr(,%eax,4)
    leal    4(%edx), %eax
    movl    %eax, _arr(,%eax,4)
    leal    5(%edx), %eax
    movl    %eax, _arr(,%eax,4)
    leal    6(%edx), %eax
    movl    %eax, _arr(,%eax,4)
    leal    7(%edx), %eax
    addl    $8, %edx
    movl    %eax, _arr(,%eax,4)
    cmpl    %ecx, %edx
    jb    L8
L7:
    popl    %ebp
    ret


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Dec 24 2009, 06:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(klen @ Dec 23 2009, 21:59) *
тоесть число итерацй известно на этапе компиляции

Оно известно. Я на простейшей функции тестирую.
Код
void TestUnroll(unsigned char* ptr1, unsigned char* ptr2)
{
unsigned int i;
  for(i = 0; i <100; i++) *ptr2++ = *ptr1++;
}

Получил с -O3 и -funroll-all-loops
Код
void TestUnroll(unsigned char* ptr1, unsigned char* ptr2)
{
       E92D4010   stmfd sp!, {r4, lr}
{
       E1A0C001   mov r12, r1
       E1A0E000   mov lr, r0
       E3A04000   mov r4, #0x00000000
unsigned int i;
  for(i = 0; i <100; i++) *ptr2++ = *ptr1++;
       E1A0000E   mov r0, lr
       E4D03001   ldrb r3, [r0], #+0x001
       E1A0100C   mov r1, r12
       E4C13001   strb r3, [r1], #+0x001
       E5DE2001   ldrb r2, [lr, #+0x001]
       E5CC2001   strb r2, [r12, #+0x001]
       E5D03001   ldrb r3, [r0, #+0x001]
       E5C13001   strb r3, [r1, #+0x001]
       E5DE0003   ldrb r0, [lr, #+0x003]
       E5CC0003   strb r0, [r12, #+0x003]
       E5DE2004   ldrb r2, [lr, #+0x004]
       E5CC2004   strb r2, [r12, #+0x004]
       E5DE3005   ldrb r3, [lr, #+0x005]
       E5CC3005   strb r3, [r12, #+0x005]
       E5DE1006   ldrb r1, [lr, #+0x006]
       E5CC1006   strb r1, [r12, #+0x006]
       E5DE0007   ldrb r0, [lr, #+0x007]
       E5CC0007   strb r0, [r12, #+0x007]
       E5DE2008   ldrb r2, [lr, #+0x008]
       E5CC2008   strb r2, [r12, #+0x008]
       E284400A   add r4, r4, #0x0000000A
       E5DE3009   ldrb r3, [lr, #+0x009]
       E3540064   cmp r4, #0x00000064
       E5CC3009   strb r3, [r12, #+0x009]
       E28EE00A   add lr, lr, #0x0000000A
       E28CC00A   add r12, r12, #0x0000000A
       1AFFFFE4   bne 0x000002C0
       E8BD8010   ldmfd sp!, {r4, pc}

Я видимо не правильно вопрос задал потому как циклы все же разворачивает, но частично - 100 итераций превращаются в 10 по 10. Сразу в 100 не хочет.
Где то это ограничение задается?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 24 2009, 06:36
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Qwertty @ Dec 24 2009, 09:21) *
Я видимо не правильно вопрос задал потому как циклы все же разворачивает, но частично - 100 итераций превращаются в 10 по 10. Сразу в 100 не хочет.
Где то это ограничение задается?

Видимо, исходит из здравого смысла.
Разворачивает, но без фанатизма.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Vova75
сообщение Jan 26 2010, 16:43
Сообщение #6





Группа: Участник
Сообщений: 10
Регистрация: 11-08-08
Из: г. Тверь
Пользователь №: 39 554



Цитата(Qwertty @ Dec 24 2009, 09:21) *
Я видимо не правильно вопрос задал потому как циклы все же разворачивает, но частично - 100 итераций превращаются в 10 по 10. Сразу в 100 не хочет.
Где то это ограничение задается?


Если подходить к делу с фанатизмом  то это поможет:
--param max-unrolled-insns=5000
--param max-average-unrolled-insns=5000
--param max-unroll-times=500
Но результат будет более чем экстремальный.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Mar 16 2010, 09:00
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Vova75 @ Jan 26 2010, 19:43) *
Если подходить к делу с фанатизмом  то это поможет:

Спасибо! Давно не заглядывал, а тут оказывается решение есть.
Гугл по этим ключикам много интересного находит...
Go to the top of the page
 
+Quote Post
dch
сообщение Mar 16 2010, 13:37
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



как помогло unroll ?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016