GassaFM / interpr

Toy language to learn parallel computing
MIT License
5 stars 4 forks source link

Непонятное количество тактов для for/while #30

Closed petsernik closed 3 years ago

petsernik commented 3 years ago

Выполним какую-нибудь простую операцию, например, x:=0 с помощью цикла несколько раз, посмотрим сколько тактов выводит при этом программа с помощью команды interpr -d program.pr со случайными входными данными. По идее оба представленных ниже кода должны выполняться за 9e4 такта (i:=0; i<1e4; x:=0; i+=1; i<1e4; x:=0; i+=1;...), а выполняются за 12e4. Получается, что в каждой итерации цикла 3 каких-то лишних такта учитываются. Почему так? image a.pr

function sum (id, pr, n, a):
    for i:=0 until 10000:
        x:=0

b.pr

function sum (id, pr, n, a):
    i:=0
    while i<10000:
        x:=0
        i+=1
petsernik commented 3 years ago

Добавил строчку, которая соответствует трём тактам, в цикл с 1e4 итерациями, а выполнение цикла увеличилось на 4e4 такта, что тоже кажется подозрительным image

petsernik commented 3 years ago

Мой вывод получился такой, x:=0 (в общем виде <var> <assignOp> <var>) выполняется за 4 такта (что отвечает на все мои предыдущие вопросы), вот примеры тестов, которые я делал: здесь 10 присваиваний: image а вот здесь уже 100: image

GassaFM commented 3 years ago

Действительно, разобрались в чате и выяснили, что каждая строка выполняется на один такт больше, чем стоимость в тактах, написанная в interpr -d. (Кроме фора, который вообще особый случай.)

Теперь вопрос: как предлагается это исправить и почему?

GassaFM commented 3 years ago

Продолжение в #32.