Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
1

Распараллеливание

28.09.2013, 12:44. Просмотров 2352. Ответов 10
Метки нет (Все метки)

Написал программу для полного перебора всех возможных n-значных комбинаций состоящих из [0,..,9,a,...,z]. Написал 3 программы: последовательный перебор, рандомный перебор, псевдорандомный перебор. Возникла проблема с распараллеливанием.

Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void bruteforce()
{char *in,*out;int i,inn;
 
ifstream fin ("Text.txt");
fin>>inn;                        //считываем из файла размер кода
in=new char[inn+1];in[inn]='\0'; //выделяем память под код
out=new char[inn+1];out[inn]='\0'; 
fin>>in;                        //считываем код
fin.close(); 
 
for(i=0;i<inn;i++)out[i]=48; //обнуляем переменную для поиска кода
int j,k,f;
while(strcmp(in,out)!=0)
{   f=0;
    out[inn-1]+=1;
    if(out[inn-1]==58)out[inn-1]=97;
    if(out[inn-1]==123)
    for(j=inn-1;j>=0 && f==0;j--)
            {
            if(out[j]!=123)
                {
                    f=1;
                    if(out[j]==58)out[j]=97;else out[j]+=1;
                }
            for(k=inn-1;k>j;k--)
            out[k]=48;
            }
}
}

Распаралеливать пробовал только так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void bruteforce_omp()
{char *in,*out;int i,inn;
 
ifstream fin ("Text.txt");
fin>>inn;                        //считываем из файла размер кода
in=new char[inn+1];in[inn]='\0'; //выделяем память под код
out=new char[inn+1];out[inn]='\0'; 
fin>>in;                        //считываем код
fin.close();
for(i=0;i<inn;i++)out[i]=48; //обнуляем переменную для поиска кода
int j,k,f;
#pragma omp parallel 
{
while(strcmp(in,out)!=0)
{   f=0;
    out[inn-1]+=1;
    if(out[inn-1]==58)out[inn-1]=97;
    if(out[inn-1]>=123)
 
    #pragma omp single nowait
    for(j=inn-1;j>=0 && f==0;j--)
            {
            if(out[j]<123)
                {
                    f=1;
                    if(out[j]==58)out[j]=97;else out[j]+=1;
                }
            for(k=inn-1;k>j;k--)
            out[k]=48;
            }
    }
}
}
Надеюсь, что кто-нибудь сможет подсказать и помочь исправить. А так же хорошо было бы, если дали ссылки на хорошие сайты\книги по распараллеливанию(желательно на русском).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2013, 12:44
Ответы с готовыми решениями:

OpenMP: распараллеливание цикла
Ниже представлена программа для численного интегрирования методом средних прямоугольников,...

Распараллеливание программы по всем процессам компьютера
Приходится иметь дело с громоздкими расчётами, которые могут занимать очень большое время. ...

Распараллеливание с MPI
Всем привет, помогите, пожалуйста распараллелить программу с помощью технологии MPI написанную на...

Распараллеливание
Уважаемые формумчане! Подскажите, кто-нибудь, пожалуйста, в чем тут может быть ошибка? using...

10
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
28.09.2013, 13:48 2
Тут не Си, а ++. Что совсем не то, для форума по Си.
Далее, берем любой сносный "букварь" по профессиональному программированию на Си, открываем раздел потоки и "курим" до полного просветления. Благо, что там ничего сложного нет по существу, после того как ясно осознаешь и поймешь как все внутренняя "кухня" работает.
0
...
1793 / 1260 / 932
Регистрация: 12.02.2013
Сообщений: 2,058
28.09.2013, 14:03 3
Artaner, из циклов расспараллеливать можно только цикл for. Цикл while может осилить по-моему только intel-овский компилятор.

А теперь посмотрите, что вы сделали:
1. (12 строка) Все потоки начинают выполнять while, т.е. каждый выполняет одно и то же.
2. (20 строка) Цикл for выполняется одним потоком.

Цитата Сообщение от Artaner Посмотреть сообщение
А так же хорошо было бы, если дали ссылки на хорошие сайты\книги по распараллеливанию(желательно на русском).
Я начинал вот с этой документации. Ещё просветится можно здесь. А из книг, вот эта очень даже не плоха, правда очень много примеров не на C, а на fortran-е.
0
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
28.09.2013, 14:20 4
Цитата Сообщение от anmartex Посмотреть сообщение
Artaner, из циклов расспараллеливать можно только цикл for. Цикл while может осилить по-моему только intel-овский компилятор.

А теперь посмотрите, что вы сделали:
1. (12 строка) Все потоки начинают выполнять while, т.е. каждый выполняет одно и то же.
2. (20 строка) Цикл for выполняется одним потоком.


Я начинал вот с этой документации. Ещё просветится можно здесь. А из книг, вот эта очень даже не плоха, правда очень много примеров не на C, а на fortran-е.

Все же настоятельно рекомендую сначала "вкурить" главу про потоки и уже потом читать вышеуказанные частности. Потоки это основа. Все остальное - частности, проистекающие из базы (основы).
0
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
28.09.2013, 15:51  [ТС] 5
Решил взять программу попроще, вот кусок кода:
C
1
2
3
4
5
6
7
8
9
10
while(strcmp(in,out)!=0)
    {   
        #pragma omp parallel for
        for(i=0;i<inn;i++)
        {
            int f;
            f=rand()%36;
            out[i]=a[f];
        }
    }
Не понимаю почему в конце цикла for получается набор двух разных(иногда одинаковых) символов. По-идее же должен каждый раз высчитывать f, но этого не происходит.
0
915 / 632 / 198
Регистрация: 08.09.2013
Сообщений: 1,690
28.09.2013, 16:15 6
fanatdebian
Приклодное программирование под OpenMP не предполагает обязатеьное знание "внутренней кухни" потоковой архитектуры.
0
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
28.09.2013, 16:41  [ТС] 7
Вот вроде как работает, но время только увеличилось:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
while(strcmp(in,out)!=0)
    {   
        #pragma omp parallel 
        {
            #pragma omp for schedule(dynamic, inn/2)
            for(i=0;i<inn;i++)
            {
 
                int f;
                f=rand()%36;
                out[i]=a[f];
            }
        }
    }
0
Z3JheSBoYXQ=
339 / 234 / 83
Регистрация: 08.07.2012
Сообщений: 577
28.09.2013, 22:07 8
Цитата Сообщение от gng Посмотреть сообщение
fanatdebian
Приклодное программирование под OpenMP не предполагает обязатеьное знание "внутренней кухни" потоковой архитектуры.
Стремление к совершенству не порок, а благость.
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
28.09.2013, 22:26 9
Цитата Сообщение от Artaner Посмотреть сообщение
Не понимаю почему в конце цикла for получается набор двух разных(иногда одинаковых) символов. По-идее же должен каждый раз высчитывать f, но этого не происходит.
Функция rand() не потокобезопасна (не thread-safe).
0
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
29.09.2013, 11:27  [ТС] 10
Цитата Сообщение от castaway Посмотреть сообщение
Функция rand() не потокобезопасна (не thread-safe).
А как тогда делать? Я ничего не нашел про это в интернете, мб не то\ не так искал.
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
29.09.2013, 14:01 11
Если есть возможность - использовать стандарт С++11, там вроде как потокобезопасные функции работы с генератором случайных чисел (которые объявлены в заголовке random).
А вообще, для меня распараллеливание в целях оптимизации (хотя других то и не бывает) и ГСЧ - вещи не совместимые.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2013, 14:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Распараллеливание
Пишу в C++/CLI программу. Потребовалось распараллелить построение фрактала. Вопрос: кто-нибудь...

Распараллеливание
Всем добрый вечер. Если кто знает подскажите,мне надо распараллелить перемножение...

Распараллеливание
Здраствуйте. Подскажите как распаралелить функцию поиска минимального элемента в масиве средствами...

Распараллеливание
Подскажите, что не так. Есть массив из 13 элементов, мне нужно разбить на три блока, один блок...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.