Форум программистов, компьютерный форум CyberForum.ru

Развертка циклов и не только - C++

Восстановить пароль Регистрация
 
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:26     Развертка циклов и не только #1
Доброго времени суток!
Помогите разобраться с техникой оптимизации циклов(коды не компилируются, не знаю по чему):
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
    for (int i = 0; i < iN; i++)
{
    res *= a[i];
}
    system("PAUSE");
    return 0; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
  for (int i = 0; i < iN; i+=3)
{
       res *= a[i];
       res *= a[i+1];
       res *= a[i+2];
}
    system("PAUSE");
    return 0; 
}
Объясните пожалуйста:
1) Что обозначает iN(я так понял это число до которого необходимо считать)
2) Что происходит в первом и во втором коде
3) Что обозначает i+=3?
C++
1
2
3
4
5
6
7
for(int i = 0; i < iN; i++)
{
   a[i] = b[i] - 5;
}
   for(int i = 0; i < iN-1; i++){
   d[i] = e[i] * 3;
}
Что происходит в 3 коде, что он делает? И опять же он не компилируется, либо переменная не объявлена (возможно тип переменной) либо не подключена библиотека какая то (что такое "В gcc можно применить следующие ключи: -funroll-all-loops -funroll-loops."- не знаю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 12:26     Развертка циклов и не только
Посмотрите здесь:

Напечатать только те слова, перед которыми в строке находятся только меньшие слова, а за ними – только большие C++
C++ напечатать только те символы, которые встречаются только в одном из слов
C++ Записать в массив X только положительные элементы исходного, а в Y только отрицательные
C++ удалить из строки только те слова, которые состоят только из латинских букв
Выбрать из текста только те символы, которые встречаются в нем только один раз C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
11.06.2013, 12:31     Развертка циклов и не только #2
iN - переменная.
1. Первый код вычисляет произведение элементов массива.
2. Вычисляет произведение элементов массива, но за одну итерацию вычисляет произведение сразу трех элементов.
3. Сами разбирайтесь.
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
В gcc можно применить следующие ключи: -funroll-all-loops -funroll-loops
Значит запустить компилятор и передать ему следующие опции.
Bash
1
gcc -funroll-all-loops -funroll-loops ..
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 12:35     Развертка циклов и не только #3
1) Что обозначает iN(я так понял это число до которого необходимо считать)

под iN подразумевается переменная-счетчик цикла. Пока условие истино (i < iN) - цикл будет крутиться. Но у вас она нигде не объявлена,как в прочем и остальные переменные (поэтому коды и не компилируются )

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

3) Что обозначает i+=3?
Означает увеличить текущее значение переменной i на 3
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:36  [ТС]     Развертка циклов и не только #4
А почему он не компилируется? gcc -funroll-all-loops -funroll-loops .. - получается надо вставить куда то...только куда, прочитав про gcc я понял что это программа, но я использую Dev-C++
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
int main()
{
    for (int i = 0; i < 10000; i++)
{
    res *= a[i];   //обижается на вот эту строчку, что необходимо с ней сделать?
}
    system("PAUSE");
    return 0; 
}
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
11.06.2013, 12:38     Развертка циклов и не только #5
Переменные res и a не объявлены.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 12:38     Развертка циклов и не только #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    int a[10000];
    int res = 1;
    for (int i = 0; i < 10000; i++)
{
    res *= a[i];
}
    system("PAUSE");
    return 0; 
}
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:40  [ТС]     Развертка циклов и не только #7
Не ну как написано так и сделал: "Используй ключевое слово register перед определением переменных в циклах".
Спасибо большое ребята, а то мы с парнишкой сидим уже часа 2 понять не можем в чем проблема
ITDeveloper
 Аватар для ITDeveloper
85 / 85 / 5
Регистрация: 14.01.2011
Сообщений: 263
11.06.2013, 12:40     Развертка циклов и не только #8
Переменные у вас не объявлены!!!
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:44  [ТС]     Развертка циклов и не только #9
Так это все хорошо, он компилируется, не чего не делается, просто написано:"Для продолжения нажмите клавишу....". Он же должен выводить счет до числа
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
11.06.2013, 12:45     Развертка циклов и не только #10
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
Он же должен
он ничего не должен. Код работает так, как написал его автор.
Tulosba
11.06.2013, 12:46
  #11

Не по теме:

Ещё язык не освоили, а уже оптимизациями занимаетесь.

DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 12:49  [ТС]     Развертка циклов и не только #12
Цитата Сообщение от Пaтрик Посмотреть сообщение
он ничего не должен. Код работает так, как написал его автор.
Почему он не чего не должен? Как я понял программа выводит счет от 0 до iN, во 2 коде получается либо идет так 0-3-6-9 и т.д. либо сразу выполняется 3 действия, получается код работает в 3 раза быстрее.
Я могу ошибаться и не понимать, но тогда почему тут он считает и выводит на экран значения?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
    int a;
    for (int i=0;i<3000;i++)
 
 
 
    cout<<"a="<<i<<endl;
    system("PAUSE");
    return 0; 
}
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 13:06     Развертка циклов и не только #13
DVGU.MAKC, Мил человек. Код делает то, что хотите вы, а не то, что хочет код. Добавили cout - стал выводить результаты работы на консоль. Не добавили - не стал.
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 13:08  [ТС]     Развертка циклов и не только #14
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, Мил человек. Код делает то, что хотите вы, а не то, что хочет код. Добавили cout - стал выводить результаты работы на консоль. Не добавили - не стал.
Все догнал, и не надо писать в основах не разобрался, лезет в оптимизацию - пошло же до меня, логика смекалка и все будет, вот что у меня получилось:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main()
{
    int a[10000];
    int res = 1;
 for (int i = 0; i < 10000; i+=3)
{
 res *= a[i];
 res *= a[i+1];
 res *= a[i+2];
 cout<<"a="<<i<<endl;
}
    system("PAUSE");
    return 0; 
}
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 13:10     Развертка циклов и не только #15
DVGU.MAKC, B и что у вас получилось?) вывели номера элементов массива? А для чего тогда вычислять произведение? может и его выведете (после цикла только).
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 13:16  [ТС]     Развертка циклов и не только #16
Так, теперь другой вопрос: "Почему когда вводишь в int a [1000000]; и в for (int i = 0; i < 1000000; i++) , открывается окно и windows сообщает об ошибке?

Добавлено через 4 минуты
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, B и что у вас получилось?) вывели номера элементов массива? А для чего тогда вычислять произведение? может и его выведете (после цикла только).
Это как получается... надо подумать....вычислять произведение.... это получается так? полюбому не правильно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
    int a[10000];
    int res = 1;
 for (int i = 0; i < 10000; i+=3)
{
 res *= a[i];
 res *= a[i+1];
 res *= a[i+2];
 cout<<"a="<<i<<endl;
}
    cout<<"a+1="<<i+1<<endl;
    cout<<"a+2="<<i+2<<endl;
    system("PAUSE");
    return 0; 
}
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
11.06.2013, 13:17     Развертка циклов и не только #17
DVGU.MAKC, массив слишком большой - зачем вам столько, возможно стек переполняется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2013, 13:45     Развертка циклов и не только
Еще ссылки по теме:

Факториал. Использовать только одну функцию main и только один цикл C++
C++ Определить виды блюд, которые есть только на завтраке, только на обеде и только на ужине
C++ Слова, состоящие только из гласных или только из согласных латинских букв

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 13:45  [ТС]     Развертка циклов и не только #18
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, массив слишком большой - зачем вам столько, возможно стек переполняется.
Правильно или нет? мне кажется не правильно

Добавлено через 4 минуты
Так тоже не правильно...
C
1
2
std::cout <<"a+1=" <<res *= a[i+1] <<std::endl;
std::cout <<"a+2=" <<res *= a[i+2] <<std::endl;
Добавлено через 4 минуты
Цитата Сообщение от kventin_zhuk Посмотреть сообщение
DVGU.MAKC, B и что у вас получилось?) вывели номера элементов массива? А для чего тогда вычислять произведение? может и его выведете (после цикла только).
Я сдаюсь, не могу понять как надо... Будьте так любезны подскажите пожалуйста или где про это можно прочитать?

Добавлено через 13 минут
kventin_zhuk, А другой вопрос, а оно вообще мне надо чтоб объяснить другому человеку на данном примере как оптимизировать цикл при помощи развертки цикла? Вставить в 2 цикла просто const clock_t start = clock(); и т.д. запустить и получается допустим на вывод номеров массива 1 программы ушло 10сек во второй программе 4сек? Мне интересно, и хотелось бы понять, как вывести результаты вычислений, получается я прошу программу вывести мне совершенно не то что она делает и поэтому результаты которые будут выданы являются неверными, только как их вывести...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
    const clock_t start = clock();
    int a[100];
    int res = 1;
 for (int i = 0; i < 100; i+=3)
{
 res *= a[i];
 res *= a[i+1];
 res *= a[i+2];
 cout<<"a="<<i<<endl;
}
    const double time = static_cast<double>(clock() 
    - start) / CLOCKS_PER_SEC;
    std::cout << time << " seconds" << std::endl;
    system("PAUSE");
    return 0; 
}
Yandex
Объявления
11.06.2013, 13:45     Развертка циклов и не только
Ответ Создать тему
Опции темы

Текущее время: 20:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru