Форум программистов, компьютерный форум, киберфорум
OpenMP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 27.10.2019
Сообщений: 29
1

Не работает распараллеливание программы с openMP

06.03.2021, 17:41. Показов 1336. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, вот суть задачи "Найти в тексте все вхождения данного образца". Программа для одного потока была написана и успешно протестирована, было принято решение сделать ее параллельной, но что-то пошло не так, время работы постоянно одно и то же. Суть программы в том, что она считывает с файла данный и записывает в переменную char, после чего ищет и сразу выводит все позиции, где находится нужный нам элемент.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <omp.h>
#include <iomanip>
#include <string>
#include<stdio.h>
#include <fstream>
using namespace std;
void poisk(const char* text, const char* src)
{
    int pos = -1, maxtx = strlen(text), maxsrc = strlen(src), s = 0, i ;
    bool check = true;
    omp_set_num_threads(4);
#pragma omp parallel default (none) private (i) shared (pos,maxtx,maxsrc,s,check,text,src, std::cout)
    {
        int id = omp_get_thread_num();
        int numt = omp_get_num_threads();
 
        for (i=id+1; i < maxtx; i=i + numt) {
            if (text[i] == src[s]) {
                pos = i;
                s++;
            }
            else {
                s = 0; pos = -1;
            }
            if (s == maxsrc) {
                cout <<pos - maxsrc + 2 << " ";
                s = 0; pos = 0; check = false;
            }
        }
    }
    if (check) {
    cout << "Такой подстроки не найдено" << endl;
    }  
}
int main()
{
    setlocale(LC_ALL, "rus");
    const char src='a';
    double start, end, time;
    int n = 32000;
    char* txt = new char[n + 1]; txt[n] = 0;
    string line;
    ifstream in("C:\\Users\\keks\\source\\repos\\parall3\\parall3\\text.txt");
    if (in.is_open())
    {
        in.read(txt, n);
    }
    else {
        cout << "error";
    }
 
    start = omp_get_wtime();
    poisk(txt, "a");
    end = omp_get_wtime();
    time = (end - start)*1000;
    cout << endl<<time;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2021, 17:41
Ответы с готовыми решениями:

Распараллеливание программы OpenMp
Здравствуйте, прошу помощи с распараллеливанием программы с помощью OpenMP. Буду рад помощи. Как я...

Распараллеливание программы OpenMp
Здравствуйте, прошу помощи с распараллеливанием программы с помощью OpenMP. Буду рад помощи. Как я...

Работа с OpenMP. Распараллеливание программы
Доброго времени суток! Есть программа, помогите быстренько ее распараллелить, буду очень...

Распараллеливание OpenMP на С
Доброе время суток, есть код программы на Си (рассматривает теорему Гольдбаха) Нужно...

4
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 18:14 2
Попробуй вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void poisk(const char* text, const char* src)
{
    int ln1 = strlen(text);
    int ln2 = strlen(src);
    int n = 0;
#pragma omp parallel for reduction(+: n)
    for (int i = 0; i < ln1 - ln2 + 1; ++i) 
    {
        bool match = true;
        for (int j = 0; j < ln2; ++j)
            if (text[i + j] != src[j])
            {
                match = false;
                break;
            }
 
        if (match)
            n += 1;
    }
 
    std::cout << "found " << n  << " matches" << std::endl;
}
}
0
0 / 0 / 0
Регистрация: 27.10.2019
Сообщений: 29
06.03.2021, 19:57  [ТС] 3
не помогло, если указать количество ядер, то хоть 1, хоть 4 время работы будет одно и то же
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
06.03.2021, 19:59 4
Цитата Сообщение от Niksus Посмотреть сообщение
не помогло, если указать количество ядер, то хоть 1, хоть 4 время работы будет одно и та жо
Для начала проверь, что у тебя openmp включено. Сделай
C++
1
2
3
#ifndef _OPENMP
static_assert(false, "openmp support required");
#endif
0
0 / 0 / 0
Регистрация: 27.10.2019
Сообщений: 29
06.03.2021, 20:08  [ТС] 5
все включено
Миниатюры
Не работает распараллеливание программы с  openMP  
0
06.03.2021, 20:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2021, 20:08
Помогаю со студенческими работами здесь

Распараллеливание в openmp
Привет всем. Задание было на лабораторную работу распараллелить вычисления. Все написал все сделал....

распараллеливание OpenMP
Помогите распараллелить алгоритм #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt;...

Распараллеливание на OpenMP
Привет, CF. Никак не удается распараллелить вычисление ряда Тейлора в поисках sin и cos с помощью...

OpenMP распараллеливание цикла
Привет кодеры! Нужна ваша помощь. У меня есть код который нужно распараллелить и тем самым получить...

Распараллеливание циклов в OpenMP
Доброго времени суток. Собственно в чем заключается вопрос: есть код, который заполняет трехмерный...

Распараллеливание с помощью OpenMP
Здравствуйте, уважаемые участники форума! Имеется цикл вида:for (i=1; i&lt;number; i++) { do...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru